2012-06-21 147 views
0

我正在開發一個使用ASP.NET MVC 3的項目,現在使用MembershipProvider,RoleProvider AuthorizeAttribute和custom。所以在代碼中使用這個的某些部分:ASP.NET MVC 3 AuthorizeAttribute

[Logon(Roles = "login, test1")] 

此代碼作品完美,使用中的MembershipProvider代碼:

public override string [] GetRolesForUser (string username) 
{ 
    var = UsuarioRepository.GetListaPermissoesByUsuarioEmail permissions (username); 

    if (permissions == null) 
    { 
     nullPermissao var = new string [0]; 
     nullPermissao return; 
    } 

    return permissions; 
} 

我的問題是。我怎樣才能使用下面的代碼,哪個方法需要自定義? 我想檢查是確定一個特定類型的用戶是否已經登錄,以及它是否具有某些特權。

[Logon(Roles = "login, test1," Users = "User1")] 

使用重寫字符串[] GetRolesForUser(用戶名字符串)方法它檢查角色,在至極方法我可以檢查用戶?

+0

你們是不是要限制訪問的方法,以特定的用戶? – bluevector

+0

我不明白你的問題。你想達到什麼目的? –

+0

對不起,我輸入錯誤的方式,實際上是「登錄」我從AuthorizeAttribute類創建的自定義屬性。 –

回答

0

您是否打算使用以下內容?

[Authorize(Roles = "login, test1", Users = "User1")] 
+0

使用覆蓋字符串[] GetRolesForUser(字符串用戶名)方法它檢查角色,在這種方法我可以檢查用戶? –

+0

不確定你在問什麼,但這是正確的屬性使用,然後你可以重寫默認角色和成員資格提供程序,以自定義方式來控制您的用戶和角色,而不是默認的aspnet數據庫表。您必須更新web.config才能使用備用提供程序。 –

1

這應該與AuthorizeAttribute開箱即用。它會檢查HttpContext.User.Identity.Name是否與您在AuthorizeAttribute下定義的任何術語相匹配。

正如我從註釋中看到的那樣,您在自己的LogonAttribute中可能覆蓋了OnAuthorize方法。這是AuthorizeAtrribute的魔力所在。

原始ASP.NET MVC源

protected virtual bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    if (httpContext == null) 
    throw new ArgumentNullException("httpContext"); 
    IPrincipal user = httpContext.User; 
    return user.Identity.IsAuthenticated && (this._usersSplit.Length <= 0 || Enumerable.Contains<string>((IEnumerable<string>) this._usersSplit, user.Identity.Name, (IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase)) && (this._rolesSplit.Length <= 0 || Enumerable.Any<string>((IEnumerable<string>) this._rolesSplit, new Func<string, bool>(user.IsInRole))); 
} 

public virtual void OnAuthorization(AuthorizationContext filterContext) 
{ 
    if (filterContext == null) 
    throw new ArgumentNullException("filterContext"); 
    if (OutputCacheAttribute.IsChildActionCacheActive((ControllerContext) filterContext)) 
    throw new InvalidOperationException(MvcResources.AuthorizeAttribute_CannotUseWithinChildActionCache); 
    if (this.AuthorizeCore(filterContext.HttpContext)) 
    { 
    HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
    cache.SetProxyMaxAge(new TimeSpan(0L)); 
    cache.AddValidationCallback(new HttpCacheValidateHandler(this.CacheValidateHandler), (object) null); 
    } 
    else 
    this.HandleUnauthorizedRequest(filterContext); 
}