Добавьте утверждения об успешном входе в систему и извлеките их в другом месте приложения

Мне нужна помощь в реализации пользовательского способа назначения претензий для аутентифицированных пользователей. При успешном входе в систему

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