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 = ?????
}
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);
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
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.
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.