2012-11-20 7 views
5
IIdentity

tôi đã phát triển một đơn giản IIdentityIPrincipal cho dự án MVC của tôi và tôi muốn ghi đè lên UserUser.Identity để trả về giá trị với đúng loạiOverride tài sản của tài

Dưới đây là danh tính tùy chỉnh của tôi:

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

đây là Principal tùy chỉnh của tôi:

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 
} 

đây là tùy chỉnh của tôi điều khiển, tôi được cập nhật thành công User tài sản để trả lại loại chính tùy chỉnh của tôi:

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

Làm thế nào tôi có thể làm điều đó một cách tương tự cho User.Identity trở lại loại sắc tùy chỉnh của tôi?

+0

bạn đặt hiệu trưởng tùy chỉnh của mình trên HttpContext ở đâu? –

+0

Trong phương thức global.asax.cs Application_AuthenticateRequest của tôi – Swell

Trả lời

3

Bạn có thể triển khai rõ ràng IPrincipal trong lớp MyPrincipal và thêm thuộc tính Identity của riêng bạn thuộc loại 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

Bạn có thể kiểm tra lại mã của mình không, tôi không thấy cách sửa nó. Cảm ơn – Swell

+0

@Swell - lỗi chính tả đã được sửa. – Joe

+0

Tôi nghĩ rằng tôi hiểu dòng này: "IIdentity IPrincipal.Identity {get {return this.Identity;}}", nhưng đây là lần đầu tiên tôi thấy một cái gì đó như thế. Bạn có thể giải thích làm thế nào để giải thích nó? TIA – Swell

1

Bạn đang yêu cầu cái gì đó không thể được thực hiện mà không có một diễn viên rõ ràng

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

Khi bạn gọi MyClass.X, bạn sẽ nhận được một ISomeThing, không phải là một SomeThing. Bạn có thể làm một diễn viên rõ ràng, nhưng đó là một chút vụng về.

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

Lý tưởng nhất, giá trị bạn lưu trữ cho IPrincipal.Name sẽ là duy nhất. Nếu "jdoe" không phải là duy nhất trong ứng dụng của bạn, thì thuộc tính IPrincipal.Name của bạn sẽ tốt hơn nếu nó lưu trữ ID người dùng. Trong trường hợp của bạn, đó dường như là một GUID.

+0

Tôi muốn làm một diễn viên rõ ràng như cho MyPrincipal User. Tôi muốn bỏ kiểu trả về của User.Identity thành MyIdentity – Swell