web-dev-qa-db-ja.com

asp.netMVCアプリケーションのweb.configでのロールの指定

フォーム認証を使用してMVCアプリケーションを作成しています。 Active Directoryに対して認証しているので、カスタム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を指定し、同じロールセットの2つの別々のリストを維持するのではなく、既存のリストを参照したいと思います。

Web.configでロールを定義するためのより良い/再利用可能な方法が必要なようですが、誰かが私を正しい方向に向けることができますか?

19
James

カスタムのauthorize属性を使用したいと思います。このように。

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>

これで最初の問題がうまく解決することを願っています。そして少しひねると2番目も解決します。

27
Mohayemin

著者があなたが直面している問題について話しているこの優れた例を見てください。

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

0
Anand