在我的數據庫中,系統用戶有一個他/她可以訪問的模塊列表。ASP.NET MVC3:自定義[授權]屬性
我想能夠添加一個授權屬性,檢查這是這種情況。
例如[authorise(UserID, ControllerName)]
轉到某些代碼,確保指定UserID的用戶在他/她的列表中具有控制器名稱。
目前,您可以通過使用URL簡單地繞過選項卡不可見的情況。 (我有代碼,如果用戶指定訪問權限的已檢查和隱藏/顯示選項卡)
在我的數據庫中,系統用戶有一個他/她可以訪問的模塊列表。ASP.NET MVC3:自定義[授權]屬性
我想能夠添加一個授權屬性,檢查這是這種情況。
例如[authorise(UserID, ControllerName)]
轉到某些代碼,確保指定UserID的用戶在他/她的列表中具有控制器名稱。
目前,您可以通過使用URL簡單地繞過選項卡不可見的情況。 (我有代碼,如果用戶指定訪問權限的已檢查和隱藏/顯示選項卡)
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
{
...
}
只有具有Foo
或Bar
角色可以訪問FooController
用戶。
您可以創建一個新屬性。
[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 */);
}
}
}
當您創建模型,檢查權限
DisplayAdminLink = _permissionService.Authorize(StandardPermissionProvider.AccessAdminPanel),
,並在視圖
@if (Model.DisplayAdminLink)
{
<li><a href="@Url.Content("~/admin")" class="ico-admin">@T("Account.Administration")</a>
</li>
}
如果你想傳遞的價值觀在自己,那麼只需添加屬性的用戶ID和ControllerName到Darin的類。然後訪問你的[MyAuthorize(UserID = xx,ControllerName =「xxx」)]。 – Sean
有什麼辦法將它們重定向到Home/index?除此之外,效果很好。謝謝!控制器的名字不是在數據庫中,而是一個腐蝕性的模塊鍵。它是現有應用程序/數據庫的Webfront,因此我們不得不使用當前的結構。 – Doomsknight
@Doomsknight,當然,只需在web.config中更改登錄網址即可。或者,如果您希望更細緻地控制屬性在身份驗證失敗時執行的操作,則可以覆蓋'HandleUnauthorizedRequest'方法。 –