2012-01-19 479 views
3

在我的數據庫中,系統用戶有一個他/她可以訪問的模塊列表。ASP.NET MVC3:自定義[授權]屬性

我想能夠添加一個授權屬性,檢查這是這種情況。

例如[authorise(UserID, ControllerName)]

轉到某些代碼,確保指定UserID的用戶在他/她的列表中具有控制器名稱。

目前,您可以通過使用URL簡單地繞過選項卡不可見的情況。 (我有代碼,如果用戶指定訪問權限的已檢查和隱藏/顯示選項卡)

回答

7
public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var isAuthorized = base.AuthorizeCore(httpContext); 
     if (!isAuthorized) 
     { 
      return false; 
     } 

     string currentUser = httpContext.User.Identity.Name; 
     string currentController = httpContext.Request.RequestContext.RouteData.GetRequiredString("controller"); 

     // TODO: go hit your database and see if currentUser can access 
     // currentController and return true/false from here 

     ... 
    } 
} 

然後裝點您的控制器或動作:

[MyAuthorize] 
public class FooController: Controller 
{ 
    ... 
} 

這是說我懷疑你通過存儲哪個用戶有權訪問哪個控制器動作的列表,可能在數據庫設計中走錯了路。可能你應該爲此使用角色。讓數據庫知道控制器只是感覺不對。

所以:

[Authorize(Roles = "Foo,Bar")] 
public class FooController: Controller 
{ 
    ... 
} 

只有具有FooBar角色可以訪問FooController用戶。

+1

如果你想傳遞的價值觀在自己,那麼只需添加屬性的用戶ID和ControllerName到Darin的類。然後訪問你的[MyAuthorize(UserID = xx,ControllerName =「xxx」)]。 – Sean

+0

有什麼辦法將它們重定向到Home/index?除此之外,效果很好。謝謝!控制器的名字不是在數據庫中,而是一個腐蝕性的模塊鍵。它是現有應用程序/數據庫的Webfront,因此我們不得不使用當前的結構。 – Doomsknight

+1

@Doomsknight,當然,只需在web.config中更改登錄網址即可。或者,如果您希望更細緻地控制屬性在身份驗證失敗時執行的操作,則可以覆蓋'HandleUnauthorizedRequest'方法。 –

1

您可以創建一個新屬性。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] 
public class CustomAuthorizeAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 

     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.Result = new HttpUnauthorizedResult(); 
     } 


     bool authorized = // Perform custom logic 

     If(!authorized) 
     { 
      filterContext.Result = new RedirectResult(/* Your access denied url */); 
     } 
    } 

} 
0

當您創建模型,檢查權限

DisplayAdminLink = _permissionService.Authorize(StandardPermissionProvider.AccessAdminPanel), 

,並在視圖

@if (Model.DisplayAdminLink) 
    { 
     <li><a href="@Url.Content("~/admin")" class="ico-admin">@T("Account.Administration")</a> 
     </li> 
    }