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;
}