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 然后立即要求我进行身份验证。我期待它允许,因为第一个条件是真的。但是,看来我的假设是不正确的。

最初,我有 Roles =“change,admin”,它们是域中的组,它可以工作,但是这些组需要在分配时是动态的,而不是静态的。我可以在那里推送多个项目。那是因为它是作为字符串发送的吗?

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

4

1 回答 1

9

在您的属性中,您是否可以拥有一个角色列表或数组,而不是拥有一个具有单个 oRole 的属性。与其放置许多属性,不如用一个属性装饰你的方法,但传递给它一个允许的角色数组。

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

此处是创建采用多个值的属性的示例

Then in your authorization checking code you can check against all the allowed list that has been provided. Something like the code below

 bool bFlag = enRoles.ToList().Any( r => AuthCheck.CheckUser(httpContext, r));
于 2013-03-16T01:54:10.007 回答