Comment mettre en œuvre custom Principal et Identity dans ASP.NET MVC?

je veux stocker des informations supplémentaires dans l'utilisateur authentifié afin que je puisse les avoir facilement accessibles (comme L'utilisateur.Identité.Id, par exemple), au lieu de juste le nom, puisque je prévois d'avoir ce non-unique.

Jusqu'à présent, je me suis rendu compte que je devrais chercher à mettre en œuvre Principal personnalisé et/ou L'identité, mais je ne suis pas sûr de la façon de procéder. J'ai cherché de la documentation et des tutoriels sur le sujet, mais j'ai trouvé des choses liées dans différents endroits et Je l'ai trouvé un peu confus.

j'ai vu comment ajouter des informations personnalisées au cookie d'authentification dans la propriété user data, mais je voudrais avoir l'avantage de l'injection de dépendance pour le test de l'unité, que je peux avoir avec le principal et l'identité.

quelles sont les étapes exactes dont je dois tenir compte si je veux mettre en œuvre mon propre principe ou ma propre identité?

Ce qui serait le le plus simple que je puisse faire dans ce scénario (il suffit d'ajouter L'ID et de garder toutes les valeurs par défaut en place)? "Par défaut" inclurait les fournisseurs par défaut (membres, rôles, etc.).

j'ai vu le autre question , mais j'apprécierais des réponses qui ne laissent pas de trous entre les deux, comme les rôles Magic strings dans L'événement AuthenticateRequest dans les exemples. Au lieu de cela, j'ai besoin de savoir comment ajouter les rôles à partir du SqlRoleProvider par défaut à l'actuel utilisateur: quand et où le faire, et si j'ai besoin de faire autre chose pour connecter mon nouveau cours avec les autres fournisseurs par défaut.

ce serait génial de pouvoir aller à un échantillon ASP.NET MVC 2 application (à partir du modèle visual studio 2010, par exemple), faire les modifications et le faire fonctionner.


EDIT: j'ai édité la question afin de mieux montrer que je suis assez perdu ici, donc je ne peux pas me contenter de réponses de trop haut niveau.

P.S.: il me semble qu'il est plus logique d'avoir L'ID dans L'identité au lieu du principal, bien que j'ai, d'une certaine manière, déclaré ceci avant.

16
demandé sur Community 2010-07-18 05:08:51

2 réponses

Cette question a été posée et répondue avant: ASP.NET MVC-Set custom IIdentity or IPrincipal

mais pour résumer...

créer une classe principale sur mesure avec les propriétés supplémentaires que vous voulez stocker:

Public Class CustomPrincipal
    Inherits System.Security.Principal.GenericPrincipal

    Private _eyeColor As String
    Public ReadOnly Property EyeColor As String
        Get
            Return _eyeColor
        End Get
    End Property

    Public Sub New(id As System.Security.Principal.IIdentity, roles As String(), eyeColor As String)
        MyBase.New(id, roles)
        _eyeColor = eyeColor            
    End Sub

End Class

modifier global.asax Global.Application_AuthenticateRequest pour l'utilisation de votre entité personnalisée:

Protected Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As System.EventArgs)
    ...
    Dim roles() As String = {"examplerole"}         
    Context.User = new CustomPrincipal(Context.User.Identity, roles, "green")
End Sub

puis ailleurs dans votre code quand vous voulez vous référer à une de ces propriétés faites ceci:

CType(My.User.CurrentPrincipal, CustomPrincipal).EyeColor
20
répondu Seth Reno 2017-05-23 12:00:17

vous ne pouvez pas vous attendre à ce que quelqu'un puisse vous enseigner tout ce que vous ne savez pas sur .NET dans quelques paragraphes. Vous pouvez lire assez bon exemple à MSDN http://msdn.microsoft.com/en-us/library/system.security.principal.genericprincipal.aspx et de creuser dans la classe et il est dérivés dans le réflecteur - il n'y a rien de spectaculaire spécial à ce sujet.

les rôles ne sont qu'une chaîne de noms pour votre propre usage, dans votre application/serveur.

cela étant dit, vous n'avez pas vraiment à viser exactement Principe derrivative à tous. Découvrez

HttpContext.Current.Items

C'est un Hashtable gratuit pour la demande que vous traitez - ce qui signifie qu'à un moment donné vous pouvez dire:

HttpContext.Current.Items["TokenUser"] = new MyThinUser(anything,I,want,there);

et puis tout le reste dans le code juste faire:

var user = HttpContext.Current.Items["TokenUser"] as MyThinUser;

et vous avez terminé.

Stocker dans votre nouvelle classe tout vous devez/voulez passer du code d'authentification à toutes les autres fonctions. Laisse la propriété de L'utilisateur intacte (de sorte que vous pouvez jeter un oeil dedans et ne pas avoir à vous inquiéter que vous avez changé quelque chose). Wihr que vous pouvez simplifier ou compliquer votre système à volonté, mais vous gardez une totale indépendance.

par exemple, si vous avez votre propre authentification et seulement quelques niveaux d'accès au lieu des rôles énumérés, vous pouvez simplement avoir un bon vieux nombre de niveaux d'accès (les rôles énumérés sont comme les chaînes sont très inefficaces de toute façon).

gardez à l'esprit que les échantillons autogénérés en VS sont généralement orientés vers un scénario particulier. Donc, si vous voyez des fournisseurs SQL pour la gestion des utilisateurs, cela ne signifie pas que vous devez réellement l'utiliser - vous pouvez toujours appeler votre propre sproc pour obtenir ce dont vous avez besoin à partir de votre propre table en SQL.

2
répondu ZXX 2010-08-03 10:47:08