【问题标题】:Specifying Roles in web.config of an asp.net MVC application在 asp.net MVC 应用程序的 web.config 中指定角色
【发布时间】:2012-07-17 08:40:15
【问题描述】:

我正在使用表单身份验证创建一个 MVC 应用程序。我正在针对活动目录进行身份验证,因此创建了一个自定义 RoleProvider。我的应用程序只关心一小组角色,到目前为止,我一直在我的 web.config 的 appSettings 部分中定义这些角色:

<appSettings>
  <add key="DirectorRole" value="Domain\Directors" />
  <add key="ManagementRole" value="Domain\Managers" />
  ...
</appSettings>

但是我在使用这种方法时遇到了一些问题:

  1. 我无法在我的控制器数据注释中引用这些设置:[Authorize(Roles = ConfigurationManager.AppSettings["DirectorRole"])],因为它不会编译,所以我必须再次指定组的名称:[Authorize(Roles = "Domain\\Directors")]
  2. 在我的 web.config 中,我想为我的角色提供者指定 groupsToUse 并仅引用一个预先存在的列表,而不是维护同一组角色的两个单独列表。

似乎必须有更好/可重用的方式来定义 web.config 中的角色,有人可以指出正确的方向吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 web-config roleprovider


    【解决方案1】:

    我更喜欢使用自定义授权属性。喜欢这个。

    public class MyAuthorizeAttribute : AuthorizeAttribute {
    
        public MyAuthorizeAttribute(params string[] roleKeys) {
            List<string> roles = new List<string>(roleKeys.Length);
    
            //foreach(var roleKey in roleKeys) {
                //roles.Add(ConfigurationManager.AppSettings["DirectorRole"]);
            //}
            var allRoles = (NameValueCollection)ConfigurationManager.GetSection("roles");
            foreach(var roleKey in roleKeys) {
                roles.Add(allRoles[roleKey]);
            }
    
            this.Roles = string.Join(",", roles);
        }
    }
    

    在您的控制器中,使用:

    [MyAuthorize("DirectorRole")]
    

    在您的 web.config 中

      <configSections>
        <section
          name="roles"
          type="System.Configuration.NameValueFileSectionHandler,System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </configSections>
    
      <roles>
        <add key="DirectorRole" value="Domain\Directors" />
        <add key="ManagementRole" value="Domain\Managers" />
      </roles>
    

    我希望这能很好地解决您的第一个问题。稍微扭动一下也能解决第二个问题。

    【讨论】:

    • 在 web.config 中是否有一个特定的位置来放置角色列表,而不仅仅是在 部分?
    • @james:我不确定有没有具体的地方。但你当然可以为你的角色腾出空间。看看here
    • 什么是角色? this.Roles = string.Join(",", 角色);是不是打错字了?
    • @Phil3992:是否导致任何编译错误?我猜 Role 是 AuthorizeAttribute 的一个属性。
    • @Mohayemin 是的,对我来说角色无法识别。即使添加了 system.web.mvc 参考
    【解决方案2】:

    请看一下这个优秀的例子,其中作者谈到了您面临的问题。

    http://www.ryanmwright.com/2010/04/25/dynamic-controlleraction-authorization-in-asp-net-mvc/

    【讨论】:

      猜你喜欢
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2015-05-18
      • 2011-12-22
      相关资源
      最近更新 更多