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

Http://brockallen.com/2013/10/24/a-primer-on-owin-cookie-authentication-middleware-for-the-asp-net-developer/

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.

entrez la description de l'image ici

97
demandé sur ROMANIA_engineer 2014-01-28 15:53:05

11 réponses

Essayez ceci:

[Authorize]
public ActionResult SomeAction()
{
    var identity = (ClaimsIdentity)User.Identity;
    IEnumerable<Claim> claims = identity.Claims;
    ...
}
135
répondu Darin Dimitrov 2014-01-28 12:02:30

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);
28
répondu hutchonoid 2018-10-01 20:41:29

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()
21
répondu Jesus Padilla 2015-12-15 10:09:42

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();
    }
}
16
répondu Quentin 2015-03-23 16:01:11

Vous pouvez également le faire.

IEnumerable<Claim> claims = ClaimsPrincipal.Current.Claims;
10
répondu angularsen 2015-09-08 09:12:13

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;
8
répondu Eric Bridges 2015-09-08 09:12:36
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é.

6
répondu Basil Banbouk 2014-04-29 08:21:52

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;
6
répondu noman zafar 2016-09-15 00:30:03

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();
5
répondu Marc Sedote Sossou 2015-03-27 22:49:36

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

entrez la description de l'image ici

Voici comment vous pouvez le faire en 1 ligne.

var claims = User.Claims.ToList();
2
répondu conterio 2016-05-31 23:58:08
var claim = User.Claims.FirstOrDefault(c => c.Type == "claim type here");
1
répondu Felipe Deveza 2018-03-22 14:38:36