Comment créer un objet ClaimsIdentity pour Asp.NET MVC 5?

je travaille dans une application .NET MVC 5. Je ne veux pas utiliser Entity Framework. Je veux m'authentifier dans une base de données RavenDB. Il me semble que je veux remplacer le UserManager cela vient avec le contrôleur de Compte. Je pense que je peux réécrire toutes les fonctions UserManager pour travailler avec ma base de données, sauf que je ne comprends pas le ClaimsIdentity objet.

Dans le SignInAsync méthode, il y a un appel à UserManager.CreateIdentityAsync(...). Je sais qu'il renvoie un ClaimsIdentity objet. Ce que je ne sais pas comment créer un objet ClaimsIdentity tout seul.

je vois qu'il a 4 propriétés Actor,BootstrapContext,Claims et Label. Je ne sais pas à quoi servent ces propriétés, et je ne sais pas comment les générer correctement. Je suppose que les générer correctement est important car c'est la façon dont le cookie d'authentification est créé.

j'ai regardé l'explication de L'objet ClaimsIdentity ici, mais cela ne m'a pas vraiment aidé à comprendre.

si je pouvais voir le code pour CreateIdentityAsync(), cela aiderait probablement.

si je m'y prends mal, faites-le-moi savoir. Autrement, si quelqu'un pouvait me montrer comment générer L'objet ClaimsIdentity, ce serait utile.

ClaimsIdentity identity = new ClaimsIdentity
{
    Actor = ????,
    BootstrapContext = ?????,
    Claims = ?????,
    Label = ?????
}
26
demandé sur user1304444 2013-12-05 08:43:03

4 réponses

peut-être le suivant le lien peut aider:

var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, "Brock"));
claims.Add(new Claim(ClaimTypes.Email, "brockallen@gmail.com"));
var id = new ClaimsIdentity(claims,DefaultAuthenticationTypes.ApplicationCookie);

var ctx = Request.GetOwinContext();
var authenticationManager = ctx.Authentication;
authenticationManager.SignIn(id);
39
répondu Vlince 2013-12-05 13:03:41

je pense que vous sont "en cours au sujet de cette tout faux". Les ASP.NET le cadre D'identité est conçu avec la persistance branchable à l'esprit. La bonne façon de substituer RavenDB à EF N'est pas de remplacer le UserManager. Il s'agit plutôt de mettre en œuvre un remplacement UserStore. De sorte que la ligne AccountController qui crée l' UserManager modifier:

public AccountController()
    : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))

À:

public AccountController()
    : this(new UserManager<ApplicationUser>(new RavenDBUserStore<ApplicationUser>/* connection info here*/)))

RavenDBUserStore serait une classe que vous avez écrit que la mise en œuvre IUserStore,IUserPasswordStore et quelle que soit autres * stockez les interfaces dont vous avez besoin pour votre application particulière.

cette approche vous évite d'avoir besoin de tout comprendre et de tout ré-implémenter en UserManager et s'assure que vous serez en mesure de profiter des améliorations futures à l' UserManager MME

Pour plus d'informations sur cette procédure, voir la aperçu des fournisseurs de stockage sur mesure pour ASP.NET identité et l'exemple de implémentation D'un MySQL personnalisé ASP.NET Fournisseur De Stockage D'Identité. Vous devriez également vérifier le code de l' RavenDB.AspNet.Identité Paquet Nuget créé en David Boike a mentionné dans son réponse. La source est sur github à https://github.com/ILMServices/RavenDB.AspNet.Identity/tree/master/RavenDB.AspNet.Identity

19
répondu Jeff Walker Code Ranger 2017-05-23 12:10:31

Voici ce que j'ai trouvé. J'aimerais savoir si c'est la bonne façon d'accomplir cette tâche.

travaillant sur un site MVC5 par défaut, je suis allé voir le contrôleur de Compte, et j'ai trouvé le SignInAsync() fonction. J'ai ajusté comme suit:

    private async Task SignInAsync(ApplicationUser user, bool isPersistent)
    {
        AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
        //var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); --> this is where I want to get rid of UserManager
        List<Claim> claims = new List<Claim>{
            new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", user.Name), //user.Name from my database
            new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", user.Id), //user.Id from my database
            new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "MyApplication"),
            new Claim("FirstName", user.FirstName) //user.FirstName from my database
        };
        ClaimsIdentity identity = new System.Security.Claims.ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);

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

gardez à l'esprit que cela nécessite également de changer le [HttpPost] Login fonction pour obtenir de l'utilisateur à partir de ma base de données au lieu d'utiliser le UserManager.FindAsync() fonction.

les parties LogIn/LogOff du site par défaut semblent fonctionner bien après ces ajustements. Je vais laisser cette réponse ici un moment avant de l'accepter au cas où quelqu'un pourrait me dire pourquoi je ne devrais pas le faire de cette façon.

9
répondu user1304444 2013-12-05 08:16:21

J'ai créé une implémentation RavenDB pour le nouveau ASP.NET MVC 5 Identity et l'a publié sous forme de paquet NuGet. Ça pourrait marcher pour toi.

http://www.nuget.org/packages/RavenDB.AspNet.Identity/

c'est un peu pré-départ mais je l'utilise dans un vrai projet.

Voici le projet GitHub et filetage court sur le RavenDB groupe de discussion à ce sujet.

5
répondu David Boike 2013-12-05 18:21:22