【问题标题】:Add User to Role ASP.NET Identity将用户添加到角色 ASP.NET 身份
【发布时间】:2013-10-30 16:58:50
【问题描述】:

我知道新成员资格包括“简单角色提供者”。

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

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

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

我有一个下拉列表来选择角色,但是使用 Entity CF 和新的 ASP.NET 身份模型我不确定如何从下拉列表中获取 selectedvalue 的 ID 和 UserID 并分配角色.

【问题讨论】:

  • 只是想知道如何将角色列表放入下拉列表中?您是在询问身份还是只是在使用已知角色的列表?
  • 自从我发布此内容以来,Asp.Net 身份已升级,我相信他们在其网站上有相关信息。抱歉,我没有链接。

标签: asp.net asp.net-identity asp.net-roles


【解决方案1】:

我在这里找到了很好的答案Adding Role dynamically in new 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);
}

最后你必须以某种方式从角色下拉列表中获取“超级用户”。

【讨论】:

  • 最佳答案,您对超人的期望会更低吗?
  • 我能否扩展这个问题以询问是否有办法在注册时向用户显示角色以供他们选择,然后在注册 POST 操作中分配给用户。跨度>
  • @Spionred 你能允许 somone 为自己选择系统管理员吗?
  • 在我的测试/实验中,我发现 currentUser 检索不是必需的。我只需调用await this.UserManager.AddToRoleAsync(user.Id, "SpecificRole"); 并将用户添加到角色中。
  • 非常感谢!在我设法使用您的解决方案之前,我头疼不已!
【解决方案2】:

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

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

【讨论】:

  • 在我的 AccountController 中我没有数据库上下文,所以我使用了“await UserManager.UpdateAsync(currentUser)”而不是“context.SaveChanges()”。
  • 我猜在控制器@ChuckKrutsinger 上有业务逻辑并不好
【解决方案3】:

虽然我同意有关 RoleManager 的其他答案,但我建议检查通过声明 (Expressing Roles as Claims) 实施授权的可能性。

从 .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”的用户添加了值为“管理员”的角色声明...

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

使用声明,您可能不再需要 RoleStore。 (AspNetRoles, AspNetUserRoles)

【讨论】:

  • Claims authorization, as suggested by MSFT, can simplify and increase the performance of authentication and authorization processes eliminating some back-end queries every time authorization takes place 你有这个声明的来源吗(双关语不是有意的:))我原以为角色会在创建令牌时被缓存,你需要阅读声明或来自存储的角色,因此 ClaimsStore 将替换 RoleStore。
  • 在周末做了很多研究之后,这似乎是事情的发展方向。我想说这对于任何在 MVC5+ 中做身份的人来说都是最好的答案。
  • 您也可以使用ClaimTypes.Role 代替 URL 来指示声明类型。因此,您可以使用以下方式创建该角色声明:new Claim(ClaimTypes.Role, "administrator")
【解决方案4】:

您是否正在寻找这样的东西:

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

同时检查User Identity

【讨论】:

  • 我看到了,据我了解是创建角色。我在桌子上创建了角色。我只是不明白在创建角色时如何将所选下拉值中的角色分配给用户。这是一个内部应用程序,“超级用户”将创建用户。所以我希望允许创建用户并在同一事件上分配一个角色。如果这令人困惑,我深表歉意。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    查看此链接: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);
            }
        }
    }
    

    【讨论】:

    • 他问如何使用 ASP .NET Identity。
    【解决方案7】:

    以下是使用基于声明的角色的“创建用户”控制器方法的替代实现。

    然后创建的声明与 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 });
        }
    

    【讨论】:

      猜你喜欢
      • 2017-05-16
      • 2016-02-11
      • 1970-01-01
      • 2020-01-24
      • 2014-08-08
      • 1970-01-01
      • 2018-09-25
      • 2017-09-25
      • 1970-01-01
      相关资源
      最近更新 更多