授权属性MVC 3和Web.Config AppSettings值

M4V*_*1CK 3 authentication asp.net-mvc-3

有没有人知道在MVC3中的控制器的Authorize属性的Web.Config AppSettings部分中是否有使用值的方法?

我目前在web.config中使用这样的东西:

<add key="AdminRole" value="Admins"/>
Run Code Online (Sandbox Code Playgroud)

,然后我尝试拉入类并使用Authorize属性上的值,但.NET抱怨值不是常量等.

我只是希望能够使用web.config中的值集来过滤授权,以便不同的部署可以根据系统配置使用角色名称的变体.

任何帮助将不胜感激,谢谢!

mar*_*ind 5

您必须编写自己的AuthorizationAttribute类,该类在运行时从web.config中读取值.在.NET中,无法使用依赖于运行时的值声明属性.


Sco*_*ttE 5

这是一个工作示例:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeByConfig : AuthorizeAttribute
{

    /// <summary>
    /// Web.config appSetting key to get comma-delimited roles from
    /// </summary>
    public string RolesAppSettingKey { get; set; }

    /// <summary>
    /// Web.config appSetting key to get comma-delimited users from
    /// </summary>
    public string UsersAppSettingKey { get; set; }


    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {

        if (!String.IsNullOrEmpty(RolesAppSettingKey))
        {
            string roles = ConfigurationManager.AppSettings[RolesAppSettingKey];
            if (!String.IsNullOrEmpty(roles))
            {
                this.Roles = roles;
            }                
        }

        if (!String.IsNullOrEmpty(UsersAppSettingKey))
        {
            string users = ConfigurationManager.AppSettings[UsersAppSettingKey];
            if (!String.IsNullOrEmpty(users))
            {
                this.Users = users;
            }                
        }

        return base.AuthorizeCore(httpContext);
    }


}
Run Code Online (Sandbox Code Playgroud)

并像这样装饰您的控制器类或方法:

[AuthorizeByConfig(RolesAppSettingKey = "Authorize.Roles", UsersAppSettingKey = "Authorize.Users")]
Run Code Online (Sandbox Code Playgroud)

其中Authorize.Roles和Authorize.Users是web.config appSettings。