44

我知道新的会员资格包括一个“简单角色提供者”。

在创建用户时,我找不到与创建用户和分配角色相关的任何帮助。我添加了一个在数据库上正确创建表的用户。我看到AspNetRolesAspNetUserRolesAspNetUsers表。

我想将一个角色分配AspNetRoles给一个用户,AspNetUsers其中角色/用户的ID都将存储在 AspNetUserRoles 中。

当我创建用户时,我被困在编程部分的何处以及如何执行此操作。

我有一个下拉列表来选择角色,但是使用实体 CF 和新的 ASP.NET 身份模型我不确定如何从下拉列表中获取 selectedvalue 的 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 回答
28

我也有同样的挑战。这是我找到的将用户添加到角色的解决方案。

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;
        }
    }
}
于 2014-10-09T16:44:34.463 回答
12

虽然我同意有关 RoleManager 的其他答案,但我建议检查通过声明实现授权的可能性(将角色表达为声明)。

从 .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("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", "administrator"));

使用上述行,您已向 ID 为“1”的用户添加了值为“管理员”的角色声明...

正如 MSFT 所建议的,声明授权可以简化和提高身份验证和授权过程的性能,从而消除每次进行授权时的一些后端查询。

使用声明,您可能不再需要 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));

还要检查用户身份

于 2013-10-30T17:03:10.217 回答
4

这个对我有用。您可以在 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 表中。

于 2019-06-24T13:06:34.283 回答
2

检查此链接:为用户分配角色。您可以向 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 属性一起使用,例如 [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 });
    }
于 2016-05-27T07:46:12.570 回答