簡體   English   中英

除了指定的例外,如何拒絕角色/用戶對所有控制器/操作的訪問asp.net MVC

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM