6

ASP MVCに比較的新しいので、私のニーズに適しているかどうかはわかりません。 Windows認証を使用してイントラネットサイトを構築し、Active Directoryの役割を使用してコントローラとアクションを保護することができました。ASP.NET MVCカスタムロールプロバイダを作成する方法

私は自分のセキュリティロールをADロールとは独立して定義する必要があります。たとえば、「マネージャ」、「ユーザー」、「ゲスト」、「アナリスト」、「開発者」など、アプリケーションデータベース内のプロファイルに関連付けられた1つ以上のロールに従って、認証されたユーザーに特定のアクションへのアクセスが許可されます。

カスタムロールプロバイダおよびカスタム認可属性を作成するにはどうすればよいですか。

EDIT:他のユーザーが投稿の内容を簡単に識別できるようにタイトルと質問を編集しました。

+0

私は最高の/きれいな方法を求めていると思うのは、さまざまな答えをたくさん得ようとしています。良いアプローチはトップダウンです。つまり、コントローラーレベルで承認し、必要に応じてメソッド/アクションレベルを制限します。エリアベースコントローラを実装して、そのエリアの各コントローラがベースを実装することもできます。権限のレベルが満たされない場合、エリアベースコントローラは適切なページにリダイレクトできます。 – Benthon

答えて

8

私のソリューションは、カスタムロールプロバイダを作成することでした。ここではケースの他の誰ニーズの私が撮ったの手順は、後に役立ちます:

は、カスタムユーザーとロールのクラス

using Microsoft.AspNet.Identity.EntityFramework; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
namespace Security.Models.Security 
{ 
    public class AppRole : IdentityRole 
    { 
    } 
} 

データベースをセットアップし
using Microsoft.AspNet.Identity.EntityFramework; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
namespace Security.Models.Security 
{ 
    public class AppUser : IdentityUser 
    { 
    } 
} 

を作成します。文脈

using Microsoft.AspNet.Identity.EntityFramework; 
using Security.Models.Security; 
using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 
using System.Web; 

namespace Security.Models.DAL 
{ 
    public class UserContext : IdentityDbContext<AppUser> 
    { 
     public UserContext() : base("UserContext") 
     { 
      Database.SetInitializer<UserContext>(new CreateDatabaseIfNotExists<UserContext>()); 
     } 
    } 
} 

ことはあなたのロールプロバイダを作成し、次の方法に

using Security.Models.DAL; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 

namespace Security.Models.Security 
{ 
    public class AppRoleProvider : RoleProvider 
    { 
     public override string[] GetAllRoles() 
     { 
      using (var userContext = new UserContext()) 
      { 
       return userContext.Roles.Select(r => r.Name).ToArray(); 
      } 
     } 

     public override string[] GetRolesForUser(string username) 
     { 
      using (var userContext = new UserContext()) 
      { 
       var user = userContext.Users.SingleOrDefault(u => u.UserName == username); 
       var userRoles = userContext.Roles.Select(r => r.Name); 

       if (user == null) 
        return new string[] { }; 
       return user.Roles == null ? new string[] { } : 
        userRoles.ToArray(); 
      } 
     } 

     public override bool IsUserInRole(string username, string roleName) 
     { 
      using (var userContext = new UserContext()) 
      { 
       var user = userContext.Users.SingleOrDefault(u => u.UserName == username); 
       var userRoles = userContext.Roles.Select(r => r.Name); 

       if (user == null) 
        return false; 
       return user.Roles != null && 
        userRoles.Any(r => r == roleName); 
      } 
     } 
    } 
} 

編集データベース接続とロールプロバイダの参照を設定するには、あなたのweb.configファイルを実装

<connectionStrings> 
    <add name="UserContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\UserContext.mdf;Initial Catalog=UserContext;Integrated Security=SSPI;" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

<system.web> 
    ... 
    <authentication mode="Windows" />   
    <roleManager enabled="true" defaultProvider="AppRoleProvider"> 
     <providers> 
     <clear/> 
     <add name="AppRoleProvider" type="Security.Models.Security.AppRoleProvider" connectionStringName = "UserContext"/> 
     </providers> 
     ... 
    </roleManager> 
    </system.web> 

210は、パッケージマネージャコンソールで、移行新しく作成された構成で

enable-migrations 

を有効にします。CSは、ユーザ/ロールストアおよび管理者を設定し、受け入れるために、ユーザーマネージャのバリデータを設定する「\」文字のパッケージマネージャコンソールで

namespace Security.Migrations 
{ 
    using Microsoft.AspNet.Identity; 
    using Microsoft.AspNet.Identity.EntityFramework; 
    using Security.Models.Security; 
    using System; 
    using System.Data.Entity; 
    using System.Data.Entity.Migrations; 
    using System.Linq; 

    internal sealed class Configuration : DbMigrationsConfiguration<Security.Models.DAL.UserContext> 
    { 
     public Configuration() 
     { 
      AutomaticMigrationsEnabled = true; 
      ContextKey = "Security.Models.DAL.UserContext"; 
     } 

     protected override void Seed(Security.Models.DAL.UserContext db) 
     { 
      // Set up the role store and the role manager 
      var roleStore = new RoleStore<AppRole>(db); 
      var roleManager = new RoleManager<AppRole>(roleStore); 

      // Set up the user store and the user mananger 
      var userStore = new UserStore<AppUser>(db); 
      var userManager = new UserManager<AppUser>(userStore); 

      // Ensure that the user manager is able to accept special characters for userNames (e.g. '\' in the 'DOMAIN\username')    
      userManager.UserValidator = new UserValidator<AppUser>(userManager) { AllowOnlyAlphanumericUserNames = false }; 

      // Seed the database with the administrator role if it does not already exist 
      if (!db.Roles.Any(r => r.Name == "Administrator")) 
      { 
       var role = new AppRole { Name = "Administrator" }; 
       roleManager.Create(role); 
      } 

      // Seed the database with the administrator user if it does not already exist 
      if (!db.Users.Any(u => u.UserName == @"DOMAIN\admin")) 
      { 
       var user = new AppUser { UserName = @"DOMAIN\admin" }; 
       userManager.Create(user); 
       // Assign the administrator role to this user 
       userManager.AddToRole(user.Id, "Administrator"); 
      } 
     } 
    } 
} 

、データベースが作成されていることを確認し、

update-database 
を播種しました

失敗したアクセス拒否ページにリダイレクトするカスタム許可属性を作成します。

完了です!アクセス拒否ページ(この場合は〜/ Home/AccessDenied)を作成して、その属性を任意のアクションに適用できるようになりました。

これは将来的に誰かに役立つことを願っています。がんばろう!

関連する問題