Je développe une application Web MVC 5 en utilisant l' approche Entity Framework 5 Database First . J'utilise OWIN pour l'authentification des utilisateurs. Ci-dessous, 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 transmets à OWIN à l'aide de AuthenticationManager pour effectuer la connexion.
Le problème que je rencontre est que je ne sais pas 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 listée 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;
Il me manque peut-être quelque chose ici.
METTRE À JOUR
Sur la base de la réponse de Darin, j'ai ajouté son code mais je n'arrive toujours pas à voir l'accès aux revendications. Veuillez voir la capture d'écran ci-dessous montrant ce que je vois lorsque je passe la souris sur l'identité.
Réponses:
Essaye ça:
la source
Vous pouvez également faire ceci:
Mettre à jour
Pour fournir des explications supplémentaires conformément aux commentaires.
Si vous créez des utilisateurs dans votre système comme suit:
Vous devriez automatiquement remplir certaines réclamations relatives à votre identité.
Pour ajouter des revendications personnalisées après l'authentification d'un utilisateur, vous pouvez procéder comme suit:
Les revendications peuvent être lues comme Darin a répondu ci-dessus ou comme je l'ai fait.
Les revendications sont conservées lorsque vous appelez ci-dessous en transmettant l'identité:
la source
Je crée ma propre classe étendue pour voir ce dont j'ai besoin, donc quand j'en ai besoin dans mon contrôleur ou ma vue, je n'ajoute que l'utilisation à mon espace de noms quelque chose comme ceci:
Dans mon contrôleur:
Dans mon rasoir:
la source
return claim?.Value;
parce que pourquoi pasCeci est une alternative si vous ne souhaitez pas utiliser les revendications tout le temps. Jetez un œil à ce tutoriel de Ben Foster.
Ensuite, vous pouvez ajouter un contrôleur de base.
Dans votre contrôleur, vous feriez:
la source
Pour approfondir la réponse de Darin, vous pouvez accéder à vos revendications spécifiques en utilisant la méthode FindFirst :
la source
Vous pouvez également le faire.
la source
N'oubliez pas que pour interroger IEnumerable, vous devez référencer system.linq.
Cela vous donnera l'objet d'extension nécessaire pour faire:
la source
La version la plus courte et simplifiée de la réponse @Rosdi Kasim'd est
Claimname
est la revendication que vous souhaitez récupérer, c.-à-d. si vous recherchez une revendication "StreedAddress", la réponse ci-dessus sera comme cecila source
Cependant, il est préférable d'ajouter les revendications à l'intérieur de la méthode "GenerateUserIdentityAsync", en particulier si regenerateIdentity dans Startup.Auth.cs est activé.
la source
GenerateUserIdentityAsync
suggestion était génial, je l' ai totalement a oublié. Merci beaucoup Basil.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.
la source
la source
Je l'ai utilisé comme ça dans mon contrôleur de base. Juste partager pour prêt à l'emploi.
la source