web-dev-qa-db-ja.com

ロールASP.NET IDへのユーザーの追加

新しいメンバーシップに「単純なロールプロバイダー」が含まれていることは知っています。

ユーザーの作成と、ユーザーの作成時に役割を割り当てることに関するヘルプが見つかりません。 [〜#〜] db [〜#〜]にテーブルを正しく作成したユーザーを追加しました。 AspNetRolesAspNetUserRoles、およびAspNetUsersテーブルが表示されます。

AspNetRolesからAspNetUsersのユーザーにロールを割り当てたいです。このロールは、ロール/ユーザーの両方の[〜#〜] id [〜#〜]です。 AspNetUserRolesに保存されます。

ユーザーを作成するときに、どこでどのようにこれを行うかというプログラミングの部分にこだわっています。

ロールを選択するためのドロップダウンリストがありますが、新しいASP.NET Identityモデルと共にエンティティCFを使用すると、ドロップダウンから選択された値のIDとUserIDを取得してロールを割り当てる方法がわかりません。

34
Brad Martin

私はここで良い答えを見つけました 新しいVS 2013 Identity UserManagerにロールを動的に追加する

しかし例を確認できるように例を提供するために、いくつかのデフォルトコードを共有します。

最初に、ロールが挿入されていることを確認します。

enter image description here

そして、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);
}

そして最後に、どういうわけかロールドロップダウンリストから「スーパーユーザー」を取得する必要があります。

62
Developer

私も同じ挑戦をしました。これは、ユーザーをロールに追加するために見つけたソリューションです。

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;
        }
    }
}
23
Tarzan

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)

12
MyOwnWay

このようなものを探していますか:

RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new MyDbContext()));
var str = RoleManager.Create(new IdentityRole(roleName));

ser Identity も確認してください

9
Rahul Tripathi

このリンクを確認してください: ユーザーへの役割の割り当て 。 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);
        }
    }
}
2
user3138901

以下は、クレームベースのロールを使用した「ユーザーの作成」コントローラーメソッドの代替実装です。

作成されたクレームは、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 });
    }
2
cwills

これは私のために動作します。このコードは、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テーブルに存在する必要があります。

0
Just Passing By