对于Entity Framework应用程序中的授权,我编写了这个类,用于检查当前用户是否处于指定角色。
public class AuthorizeDesignatedRoles : AuthorizeAttribute {
public const string DELETE = System.Configuration.ConfigurationManager.AppSettings["GroupAuthorizedForDeleteAction"].ToString();
public string DesignatedRoles { get; set; }
protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext) {
bool isAuthorizedBase = base.IsAuthorized(actionContext);
if (!isAuthorizedBase)
return false;
string[] roles = DesignatedRoles.Split(';'); // Multiple roles can be seperated by a semicolon ;
foreach (string role in roles) {
if (System.Web.Security.Roles.IsUserInRole(role))
return true;
}
return false;
}
}
现在我只允许控制器操作由指定角色的用户执行。
[AuthorizeDesignatedRoles(DesignatedRoles = AuthorizeDesignatedRoles.DELETE)]
public HttpResponseMessage DeleteThisAndThat(long id) { ... }
问题是我不想将指定的DELETE组的名称放在代码中,而是放在web.config文件中。通过这样做,Visual Studio抱怨它不再是一个常量字符串。
如何让它再次成为常量字符串?
修改:当我省略const
关键字并改为删除static readonly
时,编译器会说An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type.
答案 0 :(得分:2)
如何将AppSettings键存储在常量中并使用IsAuthorized
方法获取其值:
public class AuthorizeDesignatedRoles : AuthorizeAttribute
{
public const string DELETE = "GroupAuthorizedForDeleteAction";
public string DesignatedRoles { get; set; }
protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext) {
{
// ...
string[] roles = DesignatedRoles.Split(';')
.Select(s => ConfigurationManager.AppSettings[s].ToString())
.ToArray();
foreach (string role in roles)
{
// ...
}
}
}
答案 1 :(得分:1)
TL; DR:使用readonly
而不是const
。
常量需要在编译时设置,而不是在兼容更新中更改。编译器可以并且确实将常量值从引用的程序集复制到它们的输出程序集中。
只能在引用类型(static readonly
)或构造函数(成员readonly
)之前在代码中设置只读值,但不会强制执行进一步的更改。