19

我正在使用表单身份验证创建一个 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 中的角色,有人可以指出我正确的方向吗?

4

2 回答 2

27

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

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>

我希望这能很好地解决您的第一个问题。一点点也可以解决第二个问题。

于 2012-07-18T11:35:58.777 回答
0

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

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

于 2012-07-18T10:56:55.877 回答