MVC 5 Accès revendications identité données utilisateur
Je développe une application web MVC 5 en utilisant l'approcheEntity Framework 5 Database First . J'utilise OWIN pour l'authentification des utilisateurs. Ci-dessous montre ma méthode de connexion dans mon contrôleur de Compte.
public ActionResult Login(LoginViewModel model, string 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 je le passe à OWIN en utilisant le AuthenticationManager pour effectuer la connexion.
Le problème que j'ai est que je ne le suis pas bien sûr, comment accéder aux revendications dans le reste de mon application, que ce soit dans les contrôleurs ou dans les vues Razor.
J'avais essayé l'approche énumérés dans ce tutoriel
Par exemple, j'ai essayé ceci dans mon code de contrôleur pour tenter d'accéder aux valeurs passées dans les revendications, cependant, l'utilisateur.Claims est égal à null
var ctx = HttpContext.GetOwinContext();
ClaimsPrincipal user = ctx.Authentication.User;
IEnumerable<Claim> claims = user.Claims;
Peut-être que je le suis manque quelque chose ici.
Mise à jour
Sur la base de la réponse de Darin, j'ai ajouté son code mais je ne vois toujours pas l'accès aux revendications. S "il vous plaît voir la capture d" écran ci-dessous montrant ce que je vois quand plané sur l " identité.Réclamation.
11 réponses
Essayez ceci:
[Authorize]
public ActionResult SomeAction()
{
var identity = (ClaimsIdentity)User.Identity;
IEnumerable<Claim> claims = identity.Claims;
...
}
Vous pouvez également faire ceci:
//Get the current claims principal
var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
var claims = identity.Claims;
Mise à Jour
Fournir des explications supplémentaires selon les commentaires.
Si vous créez des utilisateurs dans votre système comme suit:
UserManager<applicationuser> userManager = new UserManager<applicationuser>(new UserStore<applicationuser>(new SecurityContext()));
ClaimsIdentity identity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
Vous devriez automatiquement avoir des revendications renseignées relatives à votre identité.
Pour ajouter 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 je l'ai fait.
Les revendications sont persistant lorsque vous appelez ci-dessous en passant l'identité dans:
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = persistCookie }, identity);
Je crée ma propre classe étendue pour voir ce dont j'ai besoin, donc quand j'ai besoin dans mon contrôleur ou ma vue, j'ajoute seulement l'utilisation à mon espace de noms quelque chose comme ceci:
public static class UserExtended
{
public static string GetFullName(this IPrincipal user)
{
var claim = ((ClaimsIdentity)user.Identity).FindFirst(ClaimTypes.Name);
return claim == null ? null : claim.Value;
}
public static string 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 rasoir:
@using DinexWebSeller.CodeHelpers.Extended;
@User.GetFullName()
C'est une alternative si vous ne voulez pas utiliser les revendications tout le temps. Jetez un oeil à ce tutoriel par Ben Foster.
public class AppUser : ClaimsPrincipal
{
public AppUser(ClaimsPrincipal principal)
: base(principal)
{
}
public string Name
{
get
{
return this.FindFirst(ClaimTypes.Name).Value;
}
}
}
Ensuite, vous pouvez ajouter 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 également le faire.
IEnumerable<Claim> claims = ClaimsPrincipal.Current.Claims;
Pour approfondir la réponse de Darin, vous pouvez accéder à vos revendications particulières 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'ajouter les revendications dans la méthode "GenerateUserIdentityAsync", surtout si regenerateIdentity dans le démarrage.Auth.cs est activé.
La version la plus courte et simplifiée de la réponse de @ Rosdi Kasim'D est
string claimvalue = ((System.Security.Claims.ClaimsIdentity)User.Identity).
FindFirst("claimname").Value;
Claimname
est-ce que la revendication que vous voulez récupérer, c'est-à-dire si vous cherchez une revendication "StreedAddress", alors la réponse ci-dessus sera comme ceci
string claimvalue = ((System.Security.Claims.ClaimsIdentity)User.Identity).
FindFirst("StreedAddress").Value;
Rappelez-vous que pour interroger IEnumerable, vous devez référencer le système.linq.
Il vous donnera l'objet d'extension nécessaire pour faire:
CaimsList.FirstOrDefault(x=>x.Type =="variableName").toString();
Selon la classe ControllerBase, vous pouvez obtenir les revendications de l'utilisateur exécutant l'action.
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");