Données d’utilisateur MVC 5 Access Claims Identity

Je développe une application Web MVC 5 utilisant l’approche Entity Framework 5 Database First . J’utilise OWIN pour l’authentification des utilisateurs. Vous trouverez ci-dessous ma méthode de connexion dans mon contrôleur de compte.

public ActionResult Login(LoginViewModel model, ssortingng returnUrl) { if (ModelState.IsValid) { var user = _AccountService.VerifyPassword(model.UserName, model.Password, false); if (user != null) { var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.UserName), }, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role); identity.AddClaim(new Claim(ClaimTypes.Role, "guest")); identity.AddClaim(new Claim(ClaimTypes.GivenName, "A Person")); identity.AddClaim(new Claim(ClaimTypes.Sid, user.userID)); //OK to store userID here? AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = model.RememberMe }, identity); return RedirectToAction("Index", "MyDashboard"); } else { ModelState.AddModelError("", "Invalid username or password."); } } // If we got this far, something failed, redisplay form return View(model); } 

Comme vous pouvez le voir, je crée un ClaimsIdentity et y ajoute plusieurs revendications, puis le transmet à OWIN à l’aide du gestionnaire d’ authentification pour effectuer la connexion.

Le problème que j’ai, c’est que je ne sais pas comment accéder aux revendications dans le rest de mon application, que ce soit dans Controllers ou dans Razor Views.

J’avais essayé l’approche listée dans ce tutoriel

A primer on OWIN cookie authentication middleware for the ASP.NET developer

Par exemple, j’ai essayé cela dans mon code Controller pour tenter d’accéder aux valeurs transmises dans les revendications, mais user.Claims est égal à null

 var ctx = HttpContext.GetOwinContext(); ClaimsPrincipal user = ctx.Authentication.User; IEnumerable claims = user.Claims; 

Peut-être que je manque quelque chose ici.

METTRE À JOUR

Sur la base de la réponse de Darin, j’ai ajouté son code mais je ne vois toujours pas l’access aux réclamations. S’il vous plaît voir la capture d’écran ci-dessous montrant ce que je vois quand survoler l’identité.Claims.

entrer la description de l'image ici

Essaye ça:

 [Authorize] public ActionResult SomeAction() { var identity = (ClaimsIdentity)User.Identity; IEnumerable claims = identity.Claims; ... } 

Vous pouvez aussi faire ceci:

 //Get the current claims principal var identity = (ClaimsPrincipal)Thread.CurrentPrincipal; var claims = identity.Claims; 

Mettre à jour

Fournir des explications supplémentaires selon les commentaires.

Si vous créez des utilisateurs dans votre système comme suit:

 UserManager userManager = new UserManager(new UserStore(new SecurityContext())); ClaimsIdentity identity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie); 

Vous devez automatiquement avoir certaines demandes d’indemnisation relatives à votre identité.

Pour append des revendications personnalisées après l’authentification d’un utilisateur, vous pouvez procéder comme suit:

 var user = userManager.Find(userName, password); identity.AddClaim(new Claim(ClaimTypes.Email, user.Email)); 

Les revendications peuvent être relues comme Darin a répondu ci-dessus ou comme j’ai.

Les revendications sont persistantes lorsque vous appelez ci-dessous en transmettant l’identité dans:

 AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = persistCookie }, identity); 

Cet article décrit ceci plus en détail et est spécifique à MVC 5, les autres articles que je connais sont destinés à MVC 4.

http://kevin-junghans.blogspot.co.uk/2013/12/using-claims-in-aspnet-identity.html

Je fais ma propre classe étendue pour voir ce dont j’ai besoin, alors quand j’ai besoin de mon contrôleur ou de mon View, je n’ajoute que l’utilisation à mon espace de noms:

 public static class UserExtended { public static ssortingng GetFullName(this IPrincipal user) { var claim = ((ClaimsIdentity)user.Identity).FindFirst(ClaimTypes.Name); return claim == null ? null : claim.Value; } public static ssortingng GetAddress(this IPrincipal user) { var claim = ((ClaimsIdentity)user.Identity).FindFirst(ClaimTypes.StreetAddress); return claim == null ? null : claim.Value; } public .... { ..... } } 

Dans mon contrôleur:

 using XXX.CodeHelpers.Extended; var claimAddress = User.GetAddress(); 

Dans mon razor:

 @using DinexWebSeller.CodeHelpers.Extended; @User.GetFullName() 

Ceci est une alternative si vous ne voulez pas utiliser les revendications tout le temps. Jetez un coup d’œil à ce tutoriel de Ben Foster.

 public class AppUser : ClaimsPrincipal { public AppUser(ClaimsPrincipal principal) : base(principal) { } public ssortingng Name { get { return this.FindFirst(ClaimTypes.Name).Value; } } } 

Ensuite, vous pouvez append un contrôleur de base.

 public abstract class AppController : Controller { public AppUser CurrentUser { get { return new AppUser(this.User as ClaimsPrincipal); } } } 

Dans votre contrôleur, vous feriez:

 public class HomeController : AppController { public ActionResult Index() { ViewBag.Name = CurrentUser.Name; return View(); } } 

Vous pouvez aussi le faire.

 IEnumerable claims = ClaimsPrincipal.Current.Claims; 

Pour approfondir la réponse de Darin, vous pouvez accéder à vos revendications spécifiques en utilisant la méthode FindFirst :

 var identity = (ClaimsIdentity)User.Identity; var role = identity.FindFirst(ClaimTypes.Role).Value; 
 Request.GetOwinContext().Authentication.User.Claims 

Cependant, il est préférable d’append les revendications à l’intérieur de la méthode “GenerateUserIdentityAsync”, en particulier si regenerateIdentity dans Startup.Auth.cs est activé.

N’oubliez pas que pour interroger le IEnumerable, vous devez référencer system.linq.
Il vous donnera l’object d’extension nécessaire pour faire:

 CaimsList.FirstOrDefault(x=>x.Type =="variableName").toSsortingng(); 

la version la plus courte et simplifiée de la réponse de @Rosdi Kasim’d est

 ssortingng claimvalue = ((System.Security.Claims.ClaimsIdentity)User.Identity). FindFirst("claimname").Value; 

Claimname est la revendication que vous voulez récupérer, c’est-à-dire que si vous recherchez “StreedAddress”, la réponse ci-dessus sera comme ceci

 ssortingng claimvalue = ((System.Security.Claims.ClaimsIdentity)User.Identity). FindFirst("StreedAddress").Value; 

Selon la classe ControllerBase, vous pouvez obtenir les revendications pour l’utilisateur exécutant l’action.

entrer la description de l'image ici

voici comment vous pouvez le faire en 1 ligne.

 var claims = User.Claims.ToList(); 
 var claim = User.Claims.FirstOrDefault(c => c.Type == "claim type here");