C# 动态地将值应用于AuthorizedAttribute类的Roles属性

C# 动态地将值应用于AuthorizedAttribute类的Roles属性,c#,asp.net-mvc,C#,Asp.net Mvc,我们有一个应用程序,它有三个级别的角色。根据用户所处的角色确定他们有权访问的内容。用户位于activedomain组中。客户要求为测试创建测试组,并在生产中使用原始组。我们使用web.config转换来区分每个环境中的组。 在此之前,为save方法设置了AuthorizedAttribute类,如下所示: [AuthorizeUsers(Roles = "Group A, Administration")] public SomeInformation Post([FromBody]So

我们有一个应用程序,它有三个级别的角色。根据用户所处的角色确定他们有权访问的内容。用户位于activedomain组中。客户要求为测试创建测试组,并在生产中使用原始组。我们使用web.config转换来区分每个环境中的组。 在此之前,为save方法设置了AuthorizedAttribute类,如下所示:

[AuthorizeUsers(Roles = "Group A, Administration")]
    public SomeInformation Post([FromBody]SomeInformation infodata)
    {
        return _manager.SaveInfo(infodata);
    } 
A组和管理层正在进行生产。在测试中,现在有A组-测试和管理-测试

是否有方法从web.config文件中提取并将其分配给Roles属性

我们尝试了以下方法:

private string Env = Settings.Default.GroupA + ", " + Settings.Default.Administration
 [AuthorizeUsers(Roles = Env)]

但它开了口。AuthorizeUsers类继承自AuthorizeAttribute。有什么想法吗?

您需要创建一个由自定义授权筛选器读取的自定义授权属性。如果全局注册筛选器,它将在正确的时间运行,并识别何时使用自定义authorize属性修饰控制器和操作方法

配置授权属性 配置授权筛选器 然后,使用
configauthorized属性
装饰控制器和操作,指定在配置文件中查找用户和角色的位置

[ConfigAuthorize(RolesConfigurationKey = "authorization:groups:home-about")]
public ActionResult About()
{
    ViewBag.Message = "Your app description page.";

    return View();
}
然后,将配置文件设置添加到
web.config
中的
appSettings

<appSettings>
    <add key="authorization:groups:home-about" value="Group A, Administration"/>
</appSettings>


是否使用不同于生产的设置进行测试?那么这不是一个有效的测试!但即便如此,为什么您不能将
[AuthorizeUsers(Roles=“Group A,Group A-Test,Administration,Administration-Test”)]
?属性被编译到DLL元数据中,并且不能在运行时更改,但是如果您确实坚持让它由配置驱动,您可以使用注册为全局筛选器的自定义
AuthorizeAttribute
来扫描所示的自定义属性-要获得如此小的效果,还有很长的路要走。因为有些用户不在生产中的更高级别组中,但需要在测试中测试新功能。安全性必须将它们放在相应的用户组中进行测试,因此允许它们访问生产中的相同区域。我们也不想为了适应不同的环境而不断地修改代码。我们原以为可以使用web.config转换,但事实并非如此。
public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new ConfigAuthorizationFilter());
        filters.Add(new HandleErrorAttribute());
    }
}
[ConfigAuthorize(RolesConfigurationKey = "authorization:groups:home-about")]
public ActionResult About()
{
    ViewBag.Message = "Your app description page.";

    return View();
}
<appSettings>
    <add key="authorization:groups:home-about" value="Group A, Administration"/>
</appSettings>