2012-11-20 9 views
5

ho sviluppato un semplice IIdentity e IPrincipal per il mio progetto MVC e vorrei ignorare il User e User.Identity per restituire il valore con il giusto tiposovrascrivere la proprietà IIdentity di utente

Ecco la mia Identità personalizzato:

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; } 
} 

Qui è la mia principale personalizzato:

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 
} 

Ecco il mio personalizzato Controller, io con successo aggiornato la proprietà User restituire il mio personalizzato Tipo principale:

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

Come posso farlo allo stesso modo per User.Identity restituire il mio tipo di un'identità personalizzata?

+0

dove stai impostando l'entità personalizzata su HttpContext? –

+0

Nel mio metodo global.asax.cs Application_AuthenticateRequest – Swell

risposta

3

È possibile implementare in modo esplicito IPrincipal nella classe MyPrincipal, e aggiungere il proprio Identity proprietà di tipo MyIdentity.

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

Potresti ricontrollare il tuo codice, non vedo come risolverlo. Grazie – Swell

+0

@Swell - errori di battitura corretti. – Joe

+0

Penso di capire questa frase: "IIdentity IPrincipal.Identity {get {return this.Identity;}}", ma questa è la prima volta che vedo qualcosa del genere. Puoi spiegare come interpretarlo? TIA – Swell

1

Stai chiedendo qualcosa che non può essere fatto senza un cast esplicito

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

Quando si chiama MyClass.X, si sta andando ad ottenere un ISomeThing, non un SomeThing. Puoi fare un cast esplicito, ma è un po 'goffo.

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

Idealmente, il valore di memorizzare per IPrincipal.Name sarà unico. Se "jdoe" non è univoco nella tua applicazione, allora la tua proprietà IPrincipal.Name sarebbe meglio se memorizzasse l'ID utente. Nel tuo caso, sembra essere un GUID.

+0

Voglio fare un cast esplicito come per MyPrincipal User. Voglio trasmettere il tipo di ritorno di User.Identity a MyIdentity – Swell

Problemi correlati