新しいメンバーシップに「単純なロールプロバイダー」が含まれていることは知っています。
ユーザーの作成と、ユーザーの作成時に役割を割り当てることに関するヘルプが見つかりません。 [〜#〜] db [〜#〜]にテーブルを正しく作成したユーザーを追加しました。 AspNetRoles
、AspNetUserRoles
、およびAspNetUsers
テーブルが表示されます。
AspNetRoles
からAspNetUsers
のユーザーにロールを割り当てたいです。このロールは、ロール/ユーザーの両方の[〜#〜] id [〜#〜]です。 AspNetUserRolesに保存されます。
ユーザーを作成するときに、どこでどのようにこれを行うかというプログラミングの部分にこだわっています。
ロールを選択するためのドロップダウンリストがありますが、新しいASP.NET Identityモデルと共にエンティティCFを使用すると、ドロップダウンから選択された値のIDとUserIDを取得してロールを割り当てる方法がわかりません。
私はここで良い答えを見つけました 新しいVS 2013 Identity UserManagerにロールを動的に追加する
しかし例を確認できるように例を提供するために、いくつかのデフォルトコードを共有します。
最初に、ロールが挿入されていることを確認します。
そして、2番目にユーザー登録方法でテストします。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser() { UserName = model.UserName };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
var currentUser = UserManager.FindByName(user.UserName);
var roleresult = UserManager.AddToRole(currentUser.Id, "Superusers");
await SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "Home");
}
else
{
AddErrors(result);
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
そして最後に、どういうわけかロールドロップダウンリストから「スーパーユーザー」を取得する必要があります。
私も同じ挑戦をしました。これは、ユーザーをロールに追加するために見つけたソリューションです。
internal class Security
{
ApplicationDbContext context = new ApplicationDbContext();
internal void AddUserToRole(string userName, string roleName)
{
var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
try
{
var user = UserManager.FindByName(userName);
UserManager.AddToRole(user.Id, roleName);
context.SaveChanges();
}
catch
{
throw;
}
}
}
RoleManagerに関する他の回答には同意しますが、クレーム( ロールをクレームとして表現する )を使用して承認を実装する可能性を検討することをお勧めします。
.NET Framework 4.5以降、Windows Identity Foundation(WIF)は.NET Frameworkに完全に統合されました。
要求に対応するアプリケーションでは、役割は、トークンで使用可能な役割要求の種類で表されます。 IsInRole()メソッドが呼び出されると、現在のユーザーがそのロールを持っているかどうかを確認するチェックが行われます。
ロール要求の種類は、次のURIを使用して表されます。 " http://schemas.Microsoft.com/ws/2008/06/identity/claims/role "
RoleManagerを使用する代わりに、UserManagerから「ロールにユーザーを追加」、このようなことをする:
var um = new UserManager();
um.AddClaimAsync(1, new Claim("http://schemas.Microsoft.com/ws/2008/06/identity/claims/role", "administrator"));
上記の行で、IDが「1」のユーザーに「administrator」という値を持つロールクレームを追加しました...
MSFTで提案されているように、クレーム承認は、承認および承認プロセスのパフォーマンスを単純化および向上させ、承認が行われるたびに一部のバックエンドクエリを排除します。
クレームを使用すると、RoleStoreが不要になる場合があります。 (AspNetRoles、AspNetUserRoles)
このようなものを探していますか:
RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new MyDbContext()));
var str = RoleManager.Create(new IdentityRole(roleName));
ser Identity も確認してください
このリンクを確認してください: ユーザーへの役割の割り当て 。 CreateUserWIzardコントロールにステップを追加し、そのステップでロールを選択できます。
<asp:CreateUserWizard ID="RegisterUserWithRoles" runat="server"
ContinueDestinationPageUrl="~/Default.aspx" LoginCreatedUser="False"
onactivestepchanged="RegisterUserWithRoles_ActiveStepChanged">
<WizardSteps>
<asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
</asp:CreateUserWizardStep>
<asp:WizardStep ID="SpecifyRolesStep" runat="server" AllowReturn="False"
StepType="Step" Title="Specify Roles">
<h3>Choose the role.</h3>
<asp:CheckBoxList ID="RoleList" runat="server">
</asp:CheckBoxList>
</asp:WizardStep>
<asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
</asp:CompleteWizardStep>
</WizardSteps>
</asp:CreateUserWizard>
そして、コードビハインドでは次のものがあります。
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
// Reference the SpecifyRolesStep WizardStep
WizardStep SpecifyRolesStep = RegisterUserWithRoles.FindControl("SpecifyRolesStep") as WizardStep;
// Reference the RoleList CheckBoxList
CheckBoxList RoleList = SpecifyRolesStep.FindControl("RoleList") as CheckBoxList;
// Bind the set of roles to RoleList
RoleList.DataSource = Roles.GetAllRoles();
RoleList.DataBind();
}
}
protected void RegisterUserWithRoles_ActiveStepChanged(object sender, EventArgs e)
{
// Have we JUST reached the Complete step?
if (RegisterUserWithRoles.ActiveStep.Title == "Complete")
{
// Reference the SpecifyRolesStep WizardStep
WizardStep SpecifyRolesStep = RegisterUserWithRoles.FindControl("SpecifyRolesStep") as WizardStep;
// Reference the RoleList CheckBoxList
CheckBoxList RoleList = SpecifyRolesStep.FindControl("RoleList") as CheckBoxList;
// Add the checked roles to the just-added user
foreach (ListItem li in RoleList.Items)
{
if (li.Selected)
Roles.AddUserToRole(RegisterUserWithRoles.UserName, li.Text);
}
}
}
以下は、クレームベースのロールを使用した「ユーザーの作成」コントローラーメソッドの代替実装です。
作成されたクレームは、Authorize属性で機能します。 [Authorize(Roles = "Admin、User。*、User.Create")]
// POST api/User/Create
[Route("Create")]
public async Task<IHttpActionResult> Create([FromBody]CreateUserModel model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
// Generate long password for the user
var password = System.Web.Security.Membership.GeneratePassword(25, 5);
// Create the user
var user = new ApiUser() { UserName = model.UserName };
var result = await UserManager.CreateAsync(user, password);
if (!result.Succeeded)
{
return GetErrorResult(result);
}
// Add roles (permissions) for the user
foreach (var perm in model.Permissions)
{
await UserManager.AddClaimAsync(user.Id, new Claim(ClaimTypes.Role, perm));
}
return Ok<object>(new { UserName = user.UserName, Password = password });
}
これは私のために動作します。このコードは、AccountController-> Registerで確認できます。
var user = new JobUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
//add this to add role to user
await UserManager.AddToRoleAsync(user.Id, "Name of your role");
}
ただし、ロール名はAspNetRolesテーブルに存在する必要があります。