2012-11-20 4 views
5

ich ein einfache für mein MVC-Projekt IIdentity und IPrincipal entwickelt habe, und ich würde den Wert mit der richtigen Artdie IIdentity Eigenschaft von Benutzern außer Kraft setzt

Hier ist meine individuelle Identität außer Kraft zu setzen wie die User und User.Identity zurückzukehren:

public class MyIdentity : IIdentity 
{ 
    public MyIdentity(string name, string authenticationType, bool isAuthenticated, Guid userId) 
    { 
     Name = name; 
     AuthenticationType = authenticationType; 
     IsAuthenticated = isAuthenticated; 
     UserId = userId; 
    } 

    #region IIdentity 
    public string Name { get; private set; } 
    public string AuthenticationType { get; private set; } 
    public bool IsAuthenticated { get; private set; } 
    #endregion 

    public Guid UserId { get; private set; } 
} 

Hier sind meine individuellen Auftraggeber:

public class MyPrincipal : IPrincipal 
{ 
    public MyPrincipal(IIdentity identity) 
    { 
     Identity = identity; 
    } 


    #region IPrincipal 
    public bool IsInRole(string role) 
    { 
     throw new NotImplementedException(); 
    } 

    public IIdentity Identity { get; private set; } 
    #endregion 
} 

Hier ist meine Gewohnheit Controller, ich habe die User Eigenschaft erfolgreich aktualisiert meinen benutzerdefinierten Haupttyp zurück:

public abstract class BaseController : Controller 
{ 
    protected new virtual MyPrincipal User 
    { 
     get { return HttpContext == null ? null : HttpContext.User as MyPrincipal; } 
    } 
} 

Wie kann ich es tun die gleiche Art und Weise für User.Identity meine individuelle Identität Typ zurückzukehren?

+0

wo setzen Sie Ihren benutzerdefinierten Prinzipal auf HttpContext? –

+0

In meiner global.asax.cs Application_AuthenticateRequest-Methode – Swell

Antwort

3

Sie können IPrincipal in Ihrer MyPrincipal Klasse explizit implementieren und Ihre eigene Identity Eigenschaft des Typs MyIdentity hinzufügen.

public class MyPrincipal : IPrincipal 
{ 
    public MyPrincipal(MyIdentity identity) 
    { 
     Identity = identity; 

    } 

    public MyIdentity Identity {get; private set; } 

    IIdentity IPrincipal.Identity { get { return this.Identity; } } 

    public bool IsInRole(string role) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Könnten Sie bitte überprüfen Sie Ihren Code, ich sehe nicht, wie Sie es beheben. Danke – Swell

+0

@Swell - Tippfehler behoben. – Joe

+0

Ich glaube, ich verstehe diese Zeile: "Identity IPrincipal.Identity {get {return this.Identity;}}", aber dies ist das erste Mal, dass ich so etwas sehe. Kannst du erklären, wie man es interpretiert? TIA – Swell

1

Sie etwas fragen, die nicht ohne eine explizite Umwandlung kann getan werden,

public class MyClass 
{ 
    private SomeThing x; 
    public ISomeThing X { get { return x; } } 
} 

Wenn Sie MyClass.X nennen, wirst du eine ISomeThing, kein SomeThing bekommen. Sie können eine explizite Besetzung machen, aber das ist ein bisschen ungeschickt.

MyClass myClass = new MyClass(); 
SomeThing someThing = (SomeThing)(myClass.X); 

Idealerweise ist der Wert, den Sie für IPrincipal.Name speichert eindeutig sein. Wenn "jdoe" in Ihrer Anwendung nicht eindeutig ist, wäre Ihre IPrincipal.Name-Eigenschaft besser, wenn sie die Benutzer-ID speichert. In Ihrem Fall scheint das eine GUID zu sein.

+0

möchte ich einen expliziten Cast wie für MyPrincipal User machen. Ich möchte den Rückgabetyp von User.Identity in MyIdentity umwandeln – Swell