C# MVC可配置授权过滤器
我想设置C# MVC可配置授权过滤器,c#,asp.net-mvc,authorization,authorize-attribute,asp.net-authorization,C#,Asp.net Mvc,Authorization,Authorize Attribute,Asp.net Authorization,我想设置[MyAuthorize(Role=“R1”)]属性,以便 “R1”可以进行配置,而不是在控制器/操作上进行硬编码 创建[MyAuthorize(Role=“R1”)]的常用方法似乎是 public class MyAuthorizeAttribute : AuthorizeAttribute { private readonly string[] _allowedRoles; public MyAuthorizeAttribute(params string[] ro
[MyAuthorize(Role=“R1”)]
属性,以便
“R1”
可以进行配置,而不是在控制器/操作
上进行硬编码
创建[MyAuthorize(Role=“R1”)]
的常用方法似乎是
public class MyAuthorizeAttribute : AuthorizeAttribute
{
private readonly string[] _allowedRoles;
public MyAuthorizeAttribute(params string[] roles)
{
this._allowedRoles = roles;
}
protected override bool OnAuthorization(AuthorizationContext
authorizationContext)
{
bool authorize = false;
// Compare current user's Roles with "R1" to figure out if the
// Action / Controller can be executed
return authorize;
}
}
但是,如果像“R1”
这样的角色随时可能发生变化,该怎么办?
i、 例如,一天被称为“R1”,另一天被称为“助理经理”
应用程序必须重新编码才能处理此问题
我想创建一个自定义的[OnAuthorize]
属性
(操作/控制器,角色)作为键值对,从web.config
中选择
例如:--
我知道MVC中
的局限性
根据https://stackoverflow.com/a/11765196/807246
我并不是在暗示,尽管我是从web.config
但是,如果我们在应用程序首次加载时读取(…并存储在会话中??)所有与授权相关的配置,会怎么样
任何更改,如“R1”->“AssistantManager”
<代码>“R2”->“Manager”
应该只需要重新启动应用程序,而不必在控制器/操作中进行代码更改
我想知道这是否是一种有效的方法,或者是否存在安全风险,即使这样,还有其他更好的选择
公元1年。您可以使用配置API读取设置,例如,如果这是常规MVC,您可以使用
ConfigurationManager.AppSettings
查看web.config
公元2年。你没有决定什么,或者更确切地说,你似乎误解了链接的帖子。您要做的是将授权
置于要保护的控制器(操作)上,并且在执行控制器/操作时触发授权
。如果确实需要,您可以查看作为参数传递的授权上下文,控制器和操作在路由数据中可用
公元3年。这是最简单的部分,当前登录的用户(如果用户尚未通过身份验证,则为匿名用户)在authorizationContext.HttpContext.user
属性中作为IPrincipal
传递,因此您甚至可以调用其IsInRole
方法
但是,如果我们在应用程序首次加载时读取(…并存储在会话中??)所有与授权相关的配置,会怎么样
你真的不必。即使您在每次请求时都从配置中读取配置,但在每次重新启动应用程序时都会预加载配置,使用ConfigurationManager.AppSettings
,您也不会真正降低任何速度
任何更改,如“R1”->“助理经理”;;“R2”->“Manager”应该只需要重新启动应用程序,而不必在控制器/操作中进行代码更改
如果将其存储在配置文件中并修改它会触发应用程序池的重新启动,则不会对代码进行任何更改
我想知道这是否是一种有效的方法,或者是否存在安全风险,即使这样,还有其他更好的选择
存在风险,可以访问你的应用服务器的人可能会重新配置你的应用。但是请注意,这样的人也可能造成任何其他伤害,例如反编译、修改、重新编译和重新加载您的应用程序。甚至用完全不同的东西来代替它
至于替代方案,如果更好的标准模糊不清,就完全不可能想出更好的方案。如果有更好的东西,我们就必须知道更好代表什么
换句话说,简单地说,这看起来不错。感谢您的见解。在这里,更好只是意味着更安全,没有
https://stackoverflow.com/a/11765196/807246
正如我所说的,声明性web.config
的授权不适用于MVC控制器/操作,链接文章中也提到了这一点。如果您不确定,请坚持使用基于属性/过滤器的授权。
<add key="Controller1" value="Role1" />
<add key="Action2" value="Role2" />
protected override bool OnAuthorization(AuthorizationContext
authorizationContext)
{
bool authorize = false;
// 1. Read all key values
// 2. determine Action / Controller the user is trying to go
// 3. Compare user's roles with those for Action / Controller
return authorize;
}