新しいAsp.net Identity Security Frameworkの使用に関するドキュメントはほとんどありません。
新しいロールを作成してユーザーを追加するためにできることをつなぎ合わせました。私は次のことを試しました: ASP.NET Identityに役割を追加
このブログから情報を得たように見えます: asp.net IDを使用して簡単なTo Doアプリケーションを構築し、ユーザーをTo Doに関連付けます
モデルが変更されるたびに実行されるデータベース初期化子にコードを追加しました。次のエラーでRoleExists
関数で失敗します。
System.InvalidOperationException
がmscorlib.dllで発生しましたエンティティタイプIdentityRoleは、現在のコンテキストのモデルの一部ではありません。
protected override void Seed (MyContext context)
{
var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
// Create Admin Role
string roleName = "Admins";
IdentityResult roleResult;
// Check to see if Role Exists, if not create it
if (!RoleManager.RoleExists(roleName))
{
roleResult = RoleManager.Create(new IdentityRole(roleName));
}
}
どんな助けも大歓迎です。
MyContext
クラスの次の署名があることを確認してください
public class MyContext : IdentityDbContext<MyUser>
または
public class MyContext : IdentityDbContext
コードは修正なしで機能しています!!!
さあ:
var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));
if(!roleManager.RoleExists("ROLE NAME"))
{
var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole();
role.Name = "ROLE NAME";
roleManager.Create(role);
}
ASP.NET Identityを使用してロールを作成、ロールを変更、ロールを削除、およびロールを管理する方法を説明する完全な記事を次に示します。これには、ユーザーインターフェイス、コントローラーメソッドなども含まれます。
http://www.dotnetfunda.com/articles/show/2898/working-with-roles-in-aspnet-identity-for-mvc
このヘルプを願っています
ありがとう
ASP.NET 5 rc1-final
では、次のことを行いました。
ApplicationRoleManager
を作成しました(テンプレートによって作成されたApplicationUser
と同様の方法で)
public class ApplicationRoleManager : RoleManager<IdentityRole>
{
public ApplicationRoleManager(
IRoleStore<IdentityRole> store,
IEnumerable<IRoleValidator<IdentityRole>> roleValidators,
ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors,
ILogger<RoleManager<IdentityRole>> logger,
IHttpContextAccessor contextAccessor)
: base(store, roleValidators, keyNormalizer, errors, logger, contextAccessor)
{
}
}
Startup.cs
のConfigureServices
に、RoleManagerとして追加しました
services.
.AddIdentity<ApplicationUser, IdentityRole>()
.AddRoleManager<ApplicationRoleManager>();
新しいロールを作成するには、次のConfigure
から呼び出します。
public static class RoleHelper
{
private static async Task EnsureRoleCreated(RoleManager<IdentityRole> roleManager, string roleName)
{
if (!await roleManager.RoleExistsAsync(roleName))
{
await roleManager.CreateAsync(new IdentityRole(roleName));
}
}
public static async Task EnsureRolesCreated(this RoleManager<IdentityRole> roleManager)
{
// add all roles, that should be in database, here
await EnsureRoleCreated(roleManager, "Developer");
}
}
public async void Configure(..., RoleManager<IdentityRole> roleManager, ...)
{
...
await roleManager.EnsureRolesCreated();
...
}
これで、ルールをユーザーに割り当てることができます
await _userManager.AddToRoleAsync(await _userManager.FindByIdAsync(User.GetUserId()), "Developer");
またはAuthorize
属性で使用されます
[Authorize(Roles = "Developer")]
public class DeveloperController : Controller
{
}
上記のPetersコードの改善として、これを使用できます。
var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));
if (!roleManager.RoleExists("Member"))
roleManager.Create(new IdentityRole("Member"));
Peter Stulinski&Dave GordonのコードサンプルをEF 6.0で使用したとき、私のアプリケーションは起動時にハングしていました。私が変更され:
var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));
に
var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(**context**));
シードメソッドでApplicationDBContext
の別のインスタンスをインスタンス化する必要がない場合、これは理にかなっています。これは、ApplicationDbContext
のコンストラクターにDatabase.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
があったという事実によってさらに悪化した可能性があります。
ロールビューモデル
public class RoleViewModel
{
public string Id { get; set; }
[Required(AllowEmptyStrings = false)]
[Display(Name = "RoleName")]
public string Name { get; set; }
}
コントローラー方式
[HttpPost]
public async Task<ActionResult> Create(RoleViewModel roleViewModel)
{
if (ModelState.IsValid)
{
var role = new IdentityRole(roleViewModel.Name);
var roleresult = await RoleManager.CreateAsync(role);
if (!roleresult.Succeeded)
{
ModelState.AddModelError("", roleresult.Errors.First());
return View();
}
return RedirectToAction("some_action");
}
return View();
}
役割を追加するための別のソリューションを共有したかった:
<h2>Create Role</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<span class="label label-primary">Role name:</span>
<p>
@Html.TextBox("RoleName", null, new { @class = "form-control input-lg" })
</p>
<input type="submit" value="Save" class="btn btn-primary" />
}
コントローラ:
[HttpGet]
public ActionResult AdminView()
{
return View();
}
[HttpPost]
public ActionResult AdminView(FormCollection collection)
{
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));
if (roleManager.RoleExists(collection["RoleName"]) == false)
{
Guid guid = Guid.NewGuid();
roleManager.Create(new IdentityRole() { Id = guid.ToString(), Name = collection["RoleName"] });
}
return View();
}
新しいASP.net Webアプリケーションを選択し、個人ユーザーアカウントを認証として選択したときに作成される既定のテンプレートを使用し、ロールを持つユーザーを作成しようとする場合、ここに解決策があります。 [HttpPost]を使用して呼び出されるAccount ControllerのRegisterメソッドで、if condition
に次の行を追加します。
microsoft.AspNet.Identity.EntityFrameworkを使用します。
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
var roleStore = new RoleStore<IdentityRole>(new ApplicationDbContext());
var roleManager = new RoleManager<IdentityRole>(roleStore);
if(!await roleManager.RoleExistsAsync("YourRoleName"))
await roleManager.CreateAsync(new IdentityRole("YourRoleName"));
await UserManager.AddToRoleAsync(user.Id, "YourRoleName");
await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
return RedirectToAction("Index", "Home");
}
これにより、まずデータベースにロールが作成され、次にこのロールに新しく作成されたユーザーが追加されます。
public static void createUserRole(string roleName)
{
if (!System.Web.Security.Roles.RoleExists(roleName))
{
System.Web.Security.Roles.CreateRole(roleName);
}
}
ロールの作成に使用する方法は以下のとおりです。コードでユーザーにロールを割り当てる方法もリストされています。以下のコードは、移行フォルダーの「configuration.cs」にあります。
string [] roleNames = { "role1", "role2", "role3" };
var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
IdentityResult roleResult;
foreach(var roleName in roleNames)
{
if(!RoleManager.RoleExists(roleName))
{
roleResult = RoleManager.Create(new IdentityRole(roleName));
}
}
var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
UserManager.AddToRole("user", "role1");
UserManager.AddToRole("user", "role2");
context.SaveChanges();