【问题标题】:How can I make the [Authorize] attribute more flexible?如何使 [Authorize] 属性更灵活?
【发布时间】:2014-06-15 07:41:56
【问题描述】:

我有一个 MVC 5 应用程序,我通过只允许某些经过身份验证的用户访问我的控制器中的特定操作来锁定它。我利用类顶部的授权属性,只允许我想在登录后获得访问权限的用户。我使用放置在班级顶部的以下属性来做到这一点......

[Authorize(Users="user1,user2")]

这很好用!但是,如果我不想每次向这个特定控制器添加新用户时都重新编译和部署应用程序怎么办?

我想我可以将它添加到我的 web.config 文件中,如下所示...

<appSettings>
  <add users="user1,user2"/>
</appSettings>

但是当我尝试像这样在控制器中访问此密钥时:[Authorize(Users=ConfigurationManager.AppSettings["users"])] 我收到一个错误:无法解析符号“AppSettings”。

有没有办法做到这一点?

【问题讨论】:

    标签: model-view-controller asp.net-mvc-5 authorize-attribute


    【解决方案1】:

    我不确定为什么一个没有回答问题的答案被接受了。无论如何,我认为可能值得为任何未来的旅行者添加答案。

    虽然没有开箱即用地提供此功能,但通过编写您自己的授权属性当然可以实现。

    public class ConfigAuthorize : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            var allowedUsers = ConfigurationManager.AppSettings["CoolActionAllowedUsers"];
            var allowedUsersArray = allowedUsers.Split(',');
    
            if (httpContext.User.Identity != null && allowedUsersArray.Contains(httpContext.User.Identity.Name))
            {
                return true;
            }
    
            return false;
        }
    }
    

    并使用属性:

    [ConfigAuthorize]
    public ActionResult CoolAction() {
        //...
    }
    

    在上面的代码中,当您在AuthorizeCore 中执行授权时,来自CoolActionAllowedUsers 的配置值将被拉入内存,并且将验证当前经过身份验证的用户是否在允许的用户列表中。如果您对配置文件进行更改,则不会有问题;应用程序池将自动重启,下次代码运行读取配置文件时,您的新值将被读取。

    我完全同意@Shoe 应该使用角色的观点。在你的代码中管理用户列表简直是一件麻烦事。事实上,在工作中,每当我收到一个要求一个随机用户访问页面的请求时,我总是需要设置一个组。但是,上面的代码也可以应用于角色列表。

    【讨论】:

    • 感谢您的回答,这实际上回答了我的问题。尽管我 100% 同意作为最佳实践提出的 Shoe 建议;我在 Stackoverflow 上经常看到的是响应者的意见,它掩盖了用户实际询问的内容。我们都有权拥有自己的意见,但通常有人提出关于如何做某事的问题是有正当理由的。话虽如此,我为你们各自的答案提供了两个道具。
    • 我的回答是提供需要的东西,而不一定是想要的东西。更适合“如何将方形钉插入圆孔?”这个问题的答案。显然是“不要使用方形钉,使用圆形钉”而不是“拿一把锯子,切割钉子,打磨钉子,重新粉刷它,然后它应该适合”。这个答案肯定回答了这个问题,尽管我不明白为什么它会被简单地使用Roles
    【解决方案2】:

    不要使用Users 参数,而是使用Roles 参数。

    [Authorize(Roles="CanExecuteActions")]
    

    现在,您可以通过授予用户此角色来管理哪些用户可以访问您的控制器。没有角色的任何用户都无法执行控制器的任何操作。

    【讨论】:

    • 感谢您的回复。我已经知道该怎么做。我真正想知道的是,我能否按照我在问题中提出的方式去做,但我会为你提供回答的道具,并将其视为“不,不能做”。
    • 是的,用户参数并不是真正有用或可扩展的。从长远来看,有了一个特殊的角色,你会省去很多麻烦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    相关资源
    最近更新 更多