44

新しいメンバーシップには「Simple Role Provider」が含まれていることを知っています。

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

ロール/ユーザーの両方のIDが AspNetUserRoles に格納されるロールをAspNetRolesユーザーに割り当てたいと考えています。AspNetUsers

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

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

4

7 に答える 7

72

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

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

まず、ロールが挿入されていることを確認してください。

ここに画像の説明を入力

次に、ユーザー登録方法でテストします。

[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);
}

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

于 2014-01-07T12:25:20.720 に答える
12

RoleManager に関する他の回答には同意しますが、クレームによる承認 (ロールをクレームとして表現する) を実装する可能性を検討することをお勧めします。

.NET Framework 4.5 以降では、Windows Identity Foundation (WIF) が .NET Framework に完全に統合されています。

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

ロール クレームの種類は、" http://schemas.microsoft.com/ws/2008/06/identity/claims/role " というURI を使用して表されます。

したがって、 RoleManager を使用する代わりに、 UserManagerから「ユーザーをロールに追加」して、次のようにすることができます。

var um = new UserManager();
um.AddClaimAsync(1, new Claim("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", "administrator"));

上記の行で、ID「1」を持つユーザーに値「管理者」を持つロール クレームを追加しました...

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

Claims を使用すると、RoleStore が不要になる場合があります。(AspNetRoles、AspNetUserRoles)

于 2014-02-03T01:29:45.210 に答える
9

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

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

ユーザー IDも確認してください

于 2013-10-30T17:03:10.217 に答える
2

このリンクを確認してください: Assigning Roles to Users . 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);
        }
    }
}
于 2014-01-03T13:43:37.963 に答える
2

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

作成されたクレームは、[Authorize(Roles = "Admin, User.*, User.Create")] などの Authorize 属性で機能します。

    // 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 });
    }
于 2016-05-27T07:46:12.570 に答える