从web.config授权Roles MVC Web

ibr*_*him 3 c# asp.net-mvc authorization

将“ System.Configuration.ConfigurationManager.AppSettings [“ ADGroupReader”]。ToString()“添加到授权角色部分标题时,出现以下编译错误。

在web.config中,我具有:添加key =“ ADGroupReader” value =“阅读器DEV”

编译错误:属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式

[AuthorizedRedirect]
[Authorize(Roles = System.Configuration.ConfigurationManager.AppSettings["ADGroupReader"].ToString())]    
public class HomeController : Controller
{
    .....
}
Run Code Online (Sandbox Code Playgroud)

我不想对角色进行硬编码(Roles =“ Readers DEV”);我想从web.config中读取它。我怎样才能做到这一点?

Tet*_*oto 5

属性教程介绍了属性参数限制:

属性参数限制为以下类型的常量值:

  • 简单类型(bool,byte,char,short,int,long,float和double)
  • 系统类型
  • 枚举
  • 对象(类型为对象的属性参数的参数必须为上述类型之一的常数。)
  • 以上任何类型的一维数组

根据上面的描述,由于存在ToString方法,因此该分配无效:

[Authorize(Roles = System.Configuration.ConfigurationManager.AppSettings["ADGroupReader"].ToString())]
Run Code Online (Sandbox Code Playgroud)

解决方法是,您可以AuthorizeAttribute使用预定义的Roles参数创建自定义,其中包含默认分配给Roles您的AppSettings

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public CustomAuthorizeAttribute() 
    {
        this.Roles = ConfigurationManager.AppSettings["ADGroupReader"].ToString();
    }

    // other stuff
}
Run Code Online (Sandbox Code Playgroud)

控制器类中的用法:

[AuthorizedRedirect]
[CustomAuthorize]
public class HomeController : Controller
{
    .....
}
Run Code Online (Sandbox Code Playgroud)


ibr*_*him 3

我是这样解决的

创建派生类 ReaderAuthorizeAttribute

public class ReaderAuthorizeAttribute : AuthorizeAttribute
{
    public ReaderAuthorizeAttribute()
    {            
        this.Roles = System.Configuration.ConfigurationManager.AppSettings["ADGroupReader"];
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return base.AuthorizeCore(httpContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后添加[LoteReaderAuthorizeAttribute]

[AuthorizedRedirect]
[ReaderAuthorizeAttribute]    
public class HomeController : Controller
{
   ....
}
Run Code Online (Sandbox Code Playgroud)