将用户添加到角色ASP.NET标识

Bra*_*tin 34 asp.net asp.net-roles asp.net-identity

我知道新会员包括"简单角色提供者".

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

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

当我创建用户时,我坚持编程部分的位置以及如何执行此操作.

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

Dev*_*per 63

在新的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);
}
Run Code Online (Sandbox Code Playgroud)

最后你必须以某种方式从角色下拉列表中获得"超级用户".

  • 最好的答案,你对超人的期望是什么? (2认同)
  • 在我的测试/实验中,我发现currentUser检索不是必需的。我只是简单地调用`wait this.UserManager.AddToRoleAsync(user.Id,“ SpecificRole”);`,然后将用户添加到该角色中。 (2认同)

Tar*_*zan 23

我遇到了同样的挑战.这是我发现将用户添加到角色的解决方案.

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在我的AccountController中,我没有数据库上下文,因此我使用"await UserManager.UpdateAsync(currentUser)"而不是"context.SaveChanges()". (3认同)

MyO*_*Way 12

虽然我同意关于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"));
Run Code Online (Sandbox Code Playgroud)

使用上面的行,您已向值为"1"的用户添加了值为"administrator"的角色声明...

根据MSFT的建议,声明授权可以简化并提高身份验证和授权过程的性能,从而在每次授权时都会消除一些后端查询.

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

  • 您还可以使用 `ClaimTypes.Role` 代替 URL 来指示声明类型。因此,您可以使用以下方法创建该角色声明:`new Claim(ClaimTypes.Role, "administrator")` (2认同)

Rah*_*thi 9

你在寻找这样的东西:

RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new MyDbContext()));
var str = RoleManager.Create(new IdentityRole(roleName));
Run Code Online (Sandbox Code Playgroud)

同时检查用户身份

  • 我看到了,根据我的理解,创建角色.我在桌面上创建了角色.我只是不明白在创建用户时如何将所选Dropdown值的角色分配给User.这是一个内部应用程序,"超级用户"将创建用户.所以我希望允许创建用户并在同一事件上分配角色.如果这令人困惑,我道歉. (2认同)