web-dev-qa-db-ja.com

ASP.NET Identityに役割を追加する

新しいASP.NET Identityシステム(1.0)にロールを追加するにはどうすればよいですか? UserStoreクラスはありますが、RoleStoreクラスはありません。

この問題に関するドキュメントは見つかりません。

39
daniel
RoleManager = new RoleManager<IdentityRole>(
                  new RoleStore<IdentityRole>(new MyDbContext()));
var roleresult = RoleManager.Create(new IdentityRole(roleName));
42
graycrow

.NET Framework 4.5以降、Windows Identity Foundation(WIF)は.NET Frameworkに完全に統合されました。

私は、クレーム( クレームをロールとして表現する )を使用して承認を実装する可能性を検討することをお勧めします。

IsInRole()メソッドが呼び出されると、現在のユーザーがそのロールを持っているかどうかを確認するチェックが行われます。要求に対応するアプリケーションでは、役割は、トークンで使用可能な役割要求の種類で表されます。

役割要求の種類は、次のURIを使用して表現されます。 " http://schemas.Microsoft.com/ws/2008/06/identity/claims/role "

UserManagerから次のようなことができます(RoleManagerなし):

var um = new UserManager();
um.AddClaimAsync(1, new Claim(ClaimTypes.Role, "administrator"));

クレームは、認証および承認プロセスのパフォーマンスを簡素化し、向上させることができます。クレームとして保存されたロールを使用して、承認が行われるたびにバックエンドクエリを排除できます。

クレームを使用すると、RoleStoreはもう必要ありません(少なくとも同等の承認目的では...)

34
MyOwnWay

1つのサンプルasp.net Webページで以下のスニペットを使用しましたpage_load方法の把握を開始するためにASP Identity works

   UserManager userManager = new UserManager();
    var roleStore = new RoleStore<IdentityRole>(new ApplicationDbContext());
    var roleManager = new RoleManager<IdentityRole>(roleStore);
    var applicationRoleAdministrator = new IdentityRole("superadmin");
    if (!roleManager.RoleExists(applicationRoleAdministrator.Name))
    {
        roleManager.Create(applicationRoleAdministrator);
    }
     ApplicationUser applicationUserAdministrator = userManager.FindByName(User.Identity.Name);

    if (!userManager.GetRoles(applicationUserAdministrator.Id).Contains("superadmin"))
    {
        Response.Redirect("~/account/login.aspx?ReturnUrl=" + Request.Url.AbsolutePath);
    }

もちろん、以下のApplicationDbContextは、以下のようなASP.NET 4.5+テンプレートで自動的に生成されます

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }
    }

また、アプリケーションロールマネージャークラスも作成します

public class ApplicationRoleManager : RoleManager<IdentityRole>
{
    public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore)
        : base(roleStore)
    {
    }

    public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
    {
        //return new ApplicationRoleManager(new RoleStore<IdentityRole>(context.Get<ApplicationDbContext>()));
        return new ApplicationRoleManager(new RoleStore<IdentityRole>(new ApplicationDbContext()));
    }
}

また、startup.Auth.cs => ConfigureAuth(IAppBuilder app)メソッドに以下の行を追加します

  app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

そしてコントローラーで:

private ApplicationRoleManager _roleManager;

public ApplicationRoleManager RoleManager
{
    get
    {
        return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
    }
    private set
    {
        _roleManager = value;
    }
}

私はこのIdentity Stuffに不慣れであり、それが必要なのか、それともクリーンで正しいことをしているのかはわかりませんが、これらの手順はうまくいきました

6
Iman Abidi

ASP.NET IDは、ロールに関してクレームに対応しています。以前のシステムではweb.configでメンバーシップとロールプロバイダーを構成していたため、それは本当に混乱しました。

私にとっての問題は、次のようなコードがあることです。

HttpContext.Current.User.IsInRole("some role")

幸いなことに、このロジックは引き続き機能します。 Microsoft.AspNet.Identity.CoreにあるClaimsIdentityFactory.csのCreateAsync関数でロジックを確認できます。引数の1つはUserManagerです。 SupportsUserRoleかどうかを尋ね、そうであればGetRolesAsyncを呼び出し、ClaimIdentityへのクレームとして各ロールを追加します。これを自分で行う必要はありません。

IsInRoleは、ここで説明するようにクレームを使用します。

http://msdn.Microsoft.com/en-us/library/hh545448.aspx

2
user3303254