从web.config授权Roles MVC web

时间:2017-04-20 01:58:23

标签: c# asp.net-mvc authorization

当我添加" System.Configuration.ConfigurationManager.AppSettings [" ADGroupReader"]时,我得到了以下编译错误.ToString()"到授权角色部分标题。

在web.config中我有:     add key =" ADGroupReader" value ="读者DEV"

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

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

我不想对该角色进行硬编码(Roles =" Readers DEV");我想从web.config中读取它。我怎么能这样做?

3 个答案:

答案 0 :(得分:4)

attributes tutorial解释了属性参数限制:

  

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

     
      
  • 简单类型(bool,byte,char,short,int,long,float和double)
  •   
  • 字符串
  •   
  • 的System.Type
  •   
  • 枚举
  •   
  • object(对象类型的属性参数的参数必须是上述类型之一的常量值。)
  •   
  • 任何上述类型的一维阵列
  •   

根据上述说明,由于存在ToString方法,此分配无效:

[Authorize(Roles = System.Configuration.ConfigurationManager.AppSettings["ADGroupReader"].ToString())]

作为一种变通方法,您可以使用预定义的AuthorizeAttribute参数创建自定义Roles,其中包含RolesAppSettings的默认分配:

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

    // other stuff
}

控制器类中的用法:

[AuthorizedRedirect]
[CustomAuthorize]
public class HomeController : Controller
{
    .....
}

答案 1 :(得分:1)

我这样解决了

创建派生类ReaderAuthorizeAttribute

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

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return base.AuthorizeCore(httpContext);
    }
}

然后添加[LoteReaderAuthorizeAttribute]

[AuthorizedRedirect]
[ReaderAuthorizeAttribute]    
public class HomeController : Controller
{
   ....
}

答案 2 :(得分:0)

我通过以下方式解决了这个问题,允许您定义角色值应该来自的设置名称:

public class AuthorizeBySettingAttribute : AuthorizeAttribute
{
    public AuthorizeBySettingAttribute(string setting) : base()
    {
        if (setting != null && Settings.Default[setting] != null)
        {
            this.Roles = Settings.Default[setting].ToString();
        }
        else
        {
            throw new InvalidOperationException("AuthorizeBySetting initialized with invalid setting");
        }
    }
}

就我而言,我从生成的 Settings 类中获取值,但您只需将 Settings.Default 更改为 ConfigurationManager.AppSettings。