我已经创建了一个自定义的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?
答案 0 :(得分:9)
在您的属性中,您可以拥有一个列表或一组角色,而不是拥有单个oRole的属性。而不是放置一些属性,用一个属性装饰你的方法,但是传递一组允许的角色。
[isAuthorized(enRoles = new oRoles[]{oRoles.StudentLookup, oRoles.StaffLookup })]
创建具有多个值的属性的示例是here
然后在您的授权检查代码中,您可以检查已提供的所有允许列表。类似下面的代码
bool bFlag = enRoles.ToList().Any( r => AuthCheck.CheckUser(httpContext, r));