gpt4 book ai didi

asp.net-mvc - ASP .NET MVC 保护 Controller / Action

转载 作者:行者123 更新时间:2023-12-03 18:27:58 26 4
gpt4 key购买 nike

如果我只想管理员访问名为“ManagerUser”的操作,我知道我可以这样做:

[Authorize( Roles = Constants.ROLES_ADMINISTRATOR )]
public ActionResult ManageUser( string id )
{
}

如果我想给除管理员之外的所有人访问权限怎么办?我不想将所有角色都写在函数 :| 上。

有什么建议/出路吗?

最佳答案

您可以创建自己的自定义授权属性,例如“AuthorizeAllExceptAdmin”。在该类中,您只需要检查当前用户是否是管理员,如果他们被拒绝,则接受它。

这是一个很好的tutorial ,但你最终可能会得到类似的结果:

public class AuthorizeAllExceptAdmin : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return !httpContext.User.IsInRole(Constants.ROLES_ADMINISTRATOR);
}
}

然后你的 Controller 方法变成:
[AuthorizeAllExceptAdmin] 
public ActionResult SomethingOnlyNonAdminsCanDo()
{
}

以下是接受角色拒绝的自定义属性的示例。
public class DoNotAuthorize : AuthorizeAttribute
{
private IEnumerable<string> _rolesToReject;

public DoNotAuthorize(IEnumerable<string> rolesToReject)
{
_rolesToReject = rolesToReject;
}

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
foreach (var role in _rolesToReject)
{
if (httpContext.User.IsInRole(role))
return false;
}

return true;
}
}

然后你的 Controller 方法变成:
[DoNotAuthorize(new [] {Constants.ROLES_ADMINISTRATOR})] 
public ActionResult SomethingOnlyNonAdminsCanDo()
{
}

在选择上述选项之一之前,我会考虑一下。如果您认为您将有几个方法(或整个 Controller )具有类似的授权要求(即管理员无法执行的几个操作),那么我会坚持使用非参数化的自定义属性。通过这种方式,您可以在以后一起发展它们(仅通过更改自定义属性)。例如,也许稍后您希望管理员能够进入一种特殊模式,在那里他们可以执行这些操作。

或者,如果 Action 之间的自动化程度更大,那么使用参数化列表是有意义的,因为它们将相对独立地发展。

关于asp.net-mvc - ASP .NET MVC 保护 Controller / Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2298110/

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