web-dev-qa-db-fra.com

Ajouter des revendications sur la connexion réussie et le récupérer ailleurs dans l'application

J'ai besoin d'aide pour mettre en œuvre un moyen personnalisé d'attribution de revendications à des utilisateurs authentifiés . 

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);

J'utilise userId pour récupérer le rôle et d'autres informations sur l'utilisateur à partir du magasin de données. Ensuite, je dois ajouter des revendications sur l'utilisateur avec ces informations telles que l'email, le rôle, le prénom, le nom, le sexe, etc. avant de rediriger vers le tableau de bord de l'utilisateur que même après avoir ajouté les revendications à la méthode de connexion, je ne parviens pas à les récupérer à la vue rasoir _loginPartial

Par exemple, lorsque je souhaite afficher la valeur de revendication par courrier électronique à la connexion partielle, comme ceci:

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();

Il retourne null.

En conséquence, je ne peux y accéder que par la même méthode de connexion après les avoir ajoutées, mais je dois pouvoir y accéder depuis n’importe où dans l’application. Je vous serais reconnaissant de toute aide sur la façon de pouvoir récupérer ces revendications n'importe où ailleurs dans la demande.

Je vous remercie.

19
Josh

Vous devez ajouter vos revendications avant vous connecter pas après. Considérons cet exemple:

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);
}

Maintenant que nous avons injecté nos revendications lors de la connexion, nous avons accès aux revendications où bon nous semble: 

((ClaimsIdentity)User.Identity).FindFirst("MyClaimName");

Vous pouvez également ajouter vos revendications dans la méthode ApplicationUser.GenerateUserIdentityAsync(). En ajoutant vos revendications dans cette méthode, vous pouvez utiliser la méthode SignInManager.PasswordSignInAsync() pour vous connecter aux utilisateurs sans aucune modification de la méthode par défaut 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;
    }
}
34

Puis dans la page de vue

@(((ClaimsIdentity)User.Identity).FindFirstValue("firstName"))

Il montrera l'utilisateur authentifié firstName.

et importer les packages suivants en haut de la page

@using Microsoft.AspNet.Identity
@using System.Security.Claims;
4
anand

Dans identity 2, cela se fait très différemment et simplement en créant une fabrique principale de revendications, puis en la connectant à votre système ConfigureServices au démarrage, comme indiqué ci-dessous ...

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;
    }
}

Vous le connecteriez ensuite à ConfigureServices juste après avoir appelé AddIdentity comme ceci ...

         services.AddIdentity<IUser, IApplicationRole>()
         .AddDefaultTokenProviders();


        // Add Custom Claims processor
        services.AddScoped<IUserClaimsPrincipalFactory<IUser>, CustomClaimsPrincipalFactory>();

Voici un très bon article sur le sujet ...

http://www.codeguru.com/csharp/csharp/cs_misc/security/asp.net-core-and-claim-based-security.html

3
Hoots

La propriété Revendiquer auprès d'IdentityUser vous donne une ICollection avec cette collection. Vous pouvez appeler la méthode C # suivante:

    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;
    }
0
Uwe Köhler