自定义MVC AuthorizeAttribute,允许多个角色成员身份

时间:2013-03-16 01:37:38

标签: c# asp.net-mvc asp.net-mvc-4

我已经创建了一个自定义的AuthorizeAttribute类来处理我的MVC4应用程序中的粒度授权。

这是班级:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class isAuthorized : AuthorizeAttribute
{
    public oRoles enRole;

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);
        string test = enRole.ToString();
        if (!authorized)
        {
            // The user is not authenticated
            return false;
        }

        var user = httpContext.User;

        bool bFlag = AuthCheck.CheckUser(httpContext, enRole);
        if (bFlag) // I know this is a lot of code; it's for debugging purposes
            return true;

        return false;
    }
}

我已声明以下枚举以允许代码帮助:

public enum oRoles
{
    StudentSelfPassword = 1,
    StaffSelfPassword = 2,
    StudentLookup = 3,
    StudentChangeRequest = 4,
    StudentAdmin = 5,
    StaffLookup = 6,
    StaffChangeRequest = 7,
    StaffAdmin = 8,
    ChangeQueueApproval = 9
}

在我的控制器中,我通过以下方式调用AuthorizeAttribute:

    [isAuthorized(enRole = oRoles.StudentLookup)]
    [isAuthorized(enRole = oRoles.StaffLookup)]
    [isAuthorized(enRole = oRoles.StudentChangeRequest)]
    [isAuthorized(enRole = oRoles.StaffChangeRequest)]

当我通过调试器运行时,第一个isAuthorized运行并返回true(应该如此)并继续到第二个isAuthorized,它返回false然后立即要求我进行身份验证。我期待它允许,因为第一个条件是真的。但是,看来我的假设不对。

最初,我有角色=“更改,管理员”,这是域中的组并且它有效,但这些组需要在他们的任务中保持动态而不是静态的。我能够在那里推出多个项目。是因为它是作为字符串发送的吗?

有没有办法基本上做一个isAuthorized(...)|| isAuthorized(...)|| isAuthorized(...)如果一个条件为真,它被验证为ok?

1 个答案:

答案 0 :(得分:9)

在您的属性中,您可以拥有一个列表或一组角色,而不是拥有单个oRole的属性。而不是放置一些属性,用一个属性装饰你的方法,但是传递一组允许的角色。

[isAuthorized(enRoles = new oRoles[]{oRoles.StudentLookup, oRoles.StaffLookup })]

创建具有多个值的属性的示例是here

然后在您的授权检查代码中,您可以检查已提供的所有允许列表。类似下面的代码

 bool bFlag = enRoles.ToList().Any( r => AuthCheck.CheckUser(httpContext, r));