在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关键字并将DELETE改为static readonly,编译器会说“属性参数必须是属性参数类型的常量表达式、typeof表达式或数组创建表达式。”
const
是一个编译时常量。因此,如果它来自文件,则无法使用const
。但问题在哪里?.NET会自动缓存配置文件。 - Tim SchmelterAppSettings["GroupAuthorizedForDeleteAction"]
包含什么内容?关于static readonly
字段的错误原因是,你只能在属性参数中使用常量,而readonly
字段不是常量。 - Henk Mollema