2012-11-20 12 views
5

I opracowali prosty IIdentity i IPrincipal dla mojego projektu MVC i chciałbym zastąpić User i User.Identity aby zwrócić wartość z prawej TypZastąp właściwość IIdentity użytkownika

Oto mój zwyczaj Tożsamość:

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

Oto mój zwyczaj Zleceniodawca:

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 
} 

Oto mój zwyczaj Kontroler, pomyślnie zaktualizowana właściwość User powrotu mojego niestandardowy typ Zleceniodawca:

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

jaki sposób można zrobić to w taki sam sposób dla User.Identity powrót mojego niestandardowy typ tożsamości?

+0

gdzie ustawiasz niestandardową zlecenie na HttpContext? –

+0

W mojej global.asax.cs Application_AuthenticateRequest metoda – Swell

Odpowiedz

3

Można jawnie wdrożyć IPrincipal w swojej klasie MyPrincipal i dodać własną Identity właściwość typu MyIdentity.

+0

Czy możesz jeszcze raz sprawdzić swój kod, nie wiem jak to naprawić. Dzięki – Swell

+0

@Swell - Naprawiono błędy. – Joe

+0

Myślę, że rozumiem tę linię: "IIdentity IPrincipal.Identity {get {return this.Identity;}}", ale po raz pierwszy widzę coś takiego. Czy możesz wyjaśnić, jak to interpretować? TIA – Swell

1

Prosisz coś, co nie może być dokonane bez wyraźnej obsady

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

Po wywołaniu MyClass.X, masz zamiar dostać ISomeThing, a nie SomeThing. Możesz wykonać wyraźną obsadę, ale to trochę nieporadne.

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

Idealnie wartość zapisać do IPrincipal.Name będzie wyjątkowy. Jeśli "jdoe" nie jest unikalne w twojej aplikacji, twoja właściwość IPrincipal.Name byłaby lepsza, gdyby przechowywał identyfikator użytkownika. W twoim przypadku wygląda na GUID.

+0

Chcę zrobić wyraźną obsadę jak dla MyPrincipal użytkownika. Chcę oddać typ zwrotu User.Identity do MyIdentity – Swell