Добавьте утверждения об успешном входе в систему и извлеките их в другом месте приложения
Мне нужна помощь в реализации пользовательского способа назначения претензий для аутентифицированных пользователей.
При успешном входе в систему
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
//Get the user
ApplicationUser user = UserManager.FindByEmail(model.Email);
//Ends here
ClaimsIdentity identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = true }, identity);
Я использую userId для извлечения роли и другой информации о пользователе из хранилища данных. После этого я должен добавить претензии к пользователю с такой информацией, как электронная почта, роль, firstName, Lastname, пол и т.д., Прежде чем перенаправлять на панель пользователя.
Так я пытаюсь это сделать, но проблема в том, что даже после добавления претензий в методе входа я не могу получить его в представлении _loginPartial бритвы
Например, когда я хочу отображать значение претензии электронной почты в части входа, подобной этой
var claims = ClaimsPrincipal.Current.Claims;
var principal = (ClaimsPrincipal)Thread.CurrentPrincipal;
var email = principal.Claims.Where(c => c.Type == ClaimTypes.Email).Select(c => c.Value).SingleOrDefault();
Он возвращает null.
Итак, в результате я могу получить к ним доступ только в том же методе входа после добавления, но мне нужно иметь доступ к нему из любого места приложения.
Пожалуйста, я буду признателен за любую помощь в том, как получить эти претензии в любом месте в приложении.
Спасибо.
Ответы
Ответ 1
Вы должны добавить свои претензии до. Рассмотрим этот пример:
public async Task<ActionResult> Login(LoginViewModel model,string returnUrl)
{
var user = UserManager.Find(model.Email, model.Password);
if(user!=null)
{
var ident = UserManager.CreateIdentity(user,
DefaultAuthenticationTypes.ApplicationCookie);
ident.AddClaims(new[] {
new Claim("MyClaimName","MyClaimValue"),
new Claim("YetAnotherClaim","YetAnotherValue"),
});
AuthenticationManager.SignIn(
new AuthenticationProperties() { IsPersistent = true },
ident);
return RedirectToLocal(returnUrl);
}
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
Теперь, когда мы ввели наши заявки во время входа, у нас есть доступ к претензиям везде, где мы хотим:
((ClaimsIdentity)User.Identity).FindFirst("MyClaimName");
Также вы можете добавить свои претензии в метод ApplicationUser.GenerateUserIdentityAsync()
. Добавив свои претензии в этот метод, вы можете использовать метод SignInManager.PasswordSignInAsync()
для входа в систему без каких-либо изменений в методе действий по умолчанию Login
.
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
userIdentity .AddClaims(new[] {
new Claim("MyClaimName","MyClaimValue"),
new Claim("YetAnotherClaim","YetAnotherValue"),
});
return userIdentity;
}
}
Ответ 2
Затем на странице просмотра
@(((ClaimsIdentity)User.Identity).FindFirstValue("firstName"))
Он покажет аутентифицированное имя пользователя firstName.
и импортируйте следующие пакеты в верхней части страницы
@using Microsoft.AspNet.Identity
@using System.Security.Claims;
Ответ 3
Вы не можете получить доступ к User.Identity
из представления?
Чтобы получить заявки для пользователя, это было так просто, как это для меня:
var identity = (ClaimsIdentity) User.Identity
И затем доступ к identity.Claims
и использование LINQ для получения конкретных требований.
Ответ 4
Свойство Claim из IdentityUser дает вам ICollection с этой коллекцией, вы можете вызвать следующий метод С#:
public string GetCustomClaimValue(ICollection<IdentityUserClaim> claimCollection, string customClaimType)
{
string claimValue = "";
foreach (IdentityUserClaim claim in claimCollection)
{
if (claim.ClaimType == customClaimType)
{
claimValue = claim.ClaimValue;
break;
}
}
return claimValue;
}
Ответ 5
В идентификаторе 2 это делается совсем по-другому и просто путем создания принципала претензий factory, а затем подключайте его к запуску ConfigureServices, как показано ниже...
public class CustomClaimsPrincipalFactory : UserClaimsPrincipalFactory<IUser, IApplicationRole>
{
public CustomClaimsPrincipalFactory(UserManager<IUser> userManager, RoleManager<IApplicationRole> roleManager,
IOptions<IdentityOptions> optionsAccessor)
: base(userManager, roleManager, optionsAccessor)
{
}
public async override Task<ClaimsPrincipal> CreateAsync(IUser user)
{
var principal = await base.CreateAsync(user);
// Add your claims here
((ClaimsIdentity)principal.Identity).AddClaims(new[] { new Claim(ClaimTypes.Email, user.Email),
new Claim(ClaimTypes.Gender, user.Gender),
new Claim(ClaimTypes.GivenName, user.FirstName),
new Claim(ClaimTypes.Surname, user.LastName)
});
return principal;
}
}
Затем вы подключите его в ConfigureServices сразу после вызова AddIdentity, как это...
services.AddIdentity<IUser, IApplicationRole>()
.AddDefaultTokenProviders();
// Add Custom Claims processor
services.AddScoped<IUserClaimsPrincipalFactory<IUser>, CustomClaimsPrincipalFactory>();
Вот очень хорошая статья по этому вопросу...
https://www.codeguru.com/csharp/csharp/cs_misc/security/asp.net-core-and-claim-based-security.html