C# 使用windows身份验证的MVC 5自定义逻辑授权

C# 使用windows身份验证的MVC 5自定义逻辑授权,c#,asp.net-mvc-5,authorization,rbac,abac,C#,Asp.net Mvc 5,Authorization,Rbac,Abac,我有一个带有Windows身份验证的MVC5项目 我使用默认的WindowsTokenRoleProvider作为角色提供程序,它适用于以下情况: [CustomAuthorization(Roles = "DOMAIN\example_group")] public ActionResult Action()... 它工作得很好。 当我想使用自定义角色(例如:Approver)时,问题开始出现。为了检查谁是真正的审批人,我必须查询一个特殊的表,并使用自定义逻辑来确定当前人员是否是审批人 为此

我有一个带有Windows身份验证的MVC5项目

我使用默认的WindowsTokenRoleProvider作为角色提供程序,它适用于以下情况:

[CustomAuthorization(Roles = "DOMAIN\example_group")]
public ActionResult Action()...
它工作得很好。 当我想使用自定义角色(例如:Approver)时,问题开始出现。为了检查谁是真正的审批人,我必须查询一个特殊的表,并使用自定义逻辑来确定当前人员是否是审批人

为此,我重写了CustomAuthorize的AuthorizeCore,并编写了如下内容:

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    if(CheckIfCurrentUserIsAnApprover()){
        return true;
    }
    ...........
}
但当我添加另一个角色(比如经理)时,会发生什么,我必须添加:

if(CheckIfCurrentUserIsManager()){
        return true;
}

如何使其更通用?

这是基于属性的访问控制ABAC的一个明确案例

ABAC通过属性扩展了基于角色的访问控制,这样您就可以根据用户的批准限制等内容做出决策

在ABAC中,您可以编写访问控制策略,例如:

如果user.location==object.location,则角色==approver的用户可以对类型==transaction的对象执行操作==查看。 用于编写策略的语言是XACML可扩展访问控制标记语言

XACML还定义了具有以下概念的体系结构:

策略实施点:应用程序前面的拦截器 策略决策点:达成决策的引擎
您可以在此处阅读更多:。Axiomatics提供了一个.net引擎和一个.net pep。

你能不能不把这个角色当作一个参数来使用?So..CheckIfCurrentUserIsApprover;或检查CurrentUserisManager;并在方法中处理这个问题?不幸的是没有。我需要检查几个条件,例如:这个用户是否有带有特定标志的X条记录等。