[英]How to deny a role / user access to all Controllers / Actions apart from specified exceptions asp.net MVC
我希望能夠指定一個角色(該角色不允許其他用戶訪問)和整個網站(而其他所有用戶均可)。
然后,我希望能夠對選定的動作執行authorize標頭的內容,以便在可能的情況下仍允許拒絕的用戶訪問此選定的動作和控制器。
我知道我可以創建一個角色,將所有其他用戶添加到該角色中,然后對該角色執行授權屬性,但是這必須對每個非啟動者的動作都必須執行,因為該項目已經用數百個構建了。沒有數千個動作。
因此,任何建議將不勝感激
這里最簡單的解決方案可能是添加“拒絕”功能的自定義Authorize屬性。 您可以通過多種方式來實現。 例如,您可以基於特定角色進行拒絕,但是如果您想拒絕應用程序不同部分的人員,那么隨着時間的流逝很難維護,那么您就必須創建不同的角色並每次更改代碼要做到這一點。
例如:
public class DenyAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return !base.AuthorizeCore(httpContext);
}
}
這將AuthorizeAttribute的Roles屬性用作拒絕。
[Deny(Roles="DeniedUsers")]
但是請注意,您將需要某種更高級別的授權,例如在Controller或全局篩選器級別,以阻止所有未經身份驗證的用戶,否則,它將允許未指定角色的任何人(包括未經身份驗證的用戶)都有權訪問。 因此,也許添加類似以下內容:
return httpContext.User.IsAuthenticated && !base.AuthorizeCore(httpContext);
另請注意,將其與[AllowAnonymous]
結合使用可能會出現問題。
另一個選擇是創建一個更靈活的系統,該系統將基於當前的控制器/操作來計算拒絕。 像這樣:
public class DenyByControllerActionAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var controller = httpContext.Request.RequestContext.RouteData.GetRequiredString("controller");
var action = httpContext.Request.RequestContext.RouteData.GetRequiredString("action");
var denyRole = string.Format("Deny{0}:{1}", controller, action);
return !httpContext.User.IsInRole(denyRole) && base.AuthorizeCore(httpContext);
}
}
然后,您可以通過將用戶添加為“ Deny {Controller}:{Action}”格式的角色來控制訪問,例如DenyHome:Index或“ DenyAdmin:Email”。
這也將要求他們也具有默認的授權訪問權限,方法是調用基本的AuthorizeCore功能。 因此,您可以將[Authorize]
替換為`[DenyByControllerAction],它的工作方式相同(或將其用作全局過濾器),但只需添加該角色即可拒絕任何用戶訪問任何Controller / Action 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.