我有一個ASP.NET MVC網站,我已經建立了一個權限系統。例如,有些鏈接在當前用戶權限不足時隱藏。但是,如果他們手動輸入該鏈接的URL,他們仍然可以訪問該內容。限制訪問MVC操作
我知道我可以使用[Authorize]
屬性來防止沒有正確用戶角色的用戶,但是如何實現我自己的屬性來阻止不符合自定義要求的用戶的操作,而無需在內部編寫手動檢查每個這些行動?
我有一個ASP.NET MVC網站,我已經建立了一個權限系統。例如,有些鏈接在當前用戶權限不足時隱藏。但是,如果他們手動輸入該鏈接的URL,他們仍然可以訪問該內容。限制訪問MVC操作
我知道我可以使用[Authorize]
屬性來防止沒有正確用戶角色的用戶,但是如何實現我自己的屬性來阻止不符合自定義要求的用戶的操作,而無需在內部編寫手動檢查每個這些行動?
你可以寫一個自定義的Authorize
屬性和覆蓋AuthorizeCore
方法,你可以把你的自定義授權邏輯:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var authroized = base.AuthorizeCore(httpContext);
if (!authroized)
{
return false;
}
// at this stage the base authorization process has passed.
// now implement your custom authorization logic and return true or false
// here you have access to the HttpContext and as a consequence to all
// request and route parameters so you could implement any
// authorization logic you want
// And of course if you want a completely custom authorization logic
// ignoring the base functionality don't call the base method above
// but completely override anything here
}
}
現在,所有剩下的是裝飾與此自定義屬性相應的控制器/行動。
如果您使用的是ASP.NET Membership,則可以配置RoleProvider併爲您的用戶提供角色。
然後,您可以使用AuthorizeAttribute上的Roles屬性來檢查角色。
[Authorize(Roles="Admin, SuperUser")]
謝謝,我正在使用ASP.NET Membership和Authorize屬性。但是,既不回答上面關於處理自定義標準的問題。 –
它不怎麼樣?你正在尋找繼承MembershipProvider。查看也繼承RoleProvider,並將其添加爲web.config中的RoleManager。這樣,你做自己的角色,並重定向到一個'訪問被拒絕'或任何如果你不想讓他們在那裏 – Phil
嗯,我沒有看繼承MembershipProvider。我只是想提供類似的功能,除了一些自定義邏輯不直接映射到我的用戶角色列表。而且我沒有選擇直接映射到我的角色,因爲我也在使用成員角色。 –
Thanks Darin。唯一的問題是我的過濾器可能需要與AuthorizeAttribute(兩個屬性都使用但具有不同的值)結合使用。直接從'FilterAttribute'派生出現問題嗎? –
是的,您可以從'FilterAttribute'派生,並通過將自定義授權邏輯放入'OnAuthorization'方法來實現'IAuthorizationFilter'接口。 –