当我添加" 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中读取它。我怎么能这样做?
答案 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
,其中包含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
}
控制器类中的用法:
[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。