gpt4 book ai didi

c# - 允许多角色成员身份的自定义 MVC AuthorizeAttribute

转载 作者:太空狗 更新时间:2023-10-30 00:25:47 24 4
gpt4 key购买 nike

我创建了一个自定义 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
}

在我的 Controller 中,我通过以下方式调用 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(...) 以便如果一个条件为真,则验证为正常?

最佳答案

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

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

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

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

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

关于c# - 允许多角色成员身份的自定义 MVC AuthorizeAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15444630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com