MVC 5 角色 Out-of-the-box

MVC 5 Roles Out-of-the-box

您好。我看到了一千个问题,但我对每一个问题都迷失了……所以……基本上我在 VS (WebAPI) 上开始了一个带有身份验证的新项目。我把令牌放在 header 上,方法放在

[Authorize]

工作正常。后来我在 table dbo.AspNetRoles(管理员和用户)中添加了两个角色,并且在 table dbo.AspNetUserRoles 中向一个用户添加了这样的关系:

USER ID    |    Roleid
-----------------------
1d156e98-fc8b-4dcb-8dba-f7c66131f488  |  1001

所以,当我试着把这个:

[Authorize(role="admin")]

不工作...请求被拒绝。 我具体需要做什么?

谢谢

不是"Authentication"而是"Authorize"。试试这个:

[Authorize(Roles = "admin")]

但首先你必须创建你的角色:

context.Roles.Add(new IdentityRole { Name = "admin" });
context.SaveChanges();

并为用户分配角色:

var role = context.Roles.SingleOrDefault(m => m.Name == "admin");
user.Roles.Add(new IdentityUserRole { RoleId = role.Id });

数据库初始化代码可以放在任何你想放的地方,这取决于你:

  • 应用程序启动时 - 检查角色是否存在,如果没有则创建它们
  • 生成迁移并通过自定义角色插入更新迁移脚本
  • 将它们手动放入数据库中 - 但您必须以正确的方式进行操作 - 从代码中添加角色并检查数据库中发生了什么变化

所以最后我使用下面的代码来解决这个问题:

public class DAO
{
    public static void addRoleToUser(ApplicationUser user, string role)
    {
        // EL SIGUIENTE CODIGO AGREGA AL USUARIO UN ROL
        ApplicationDbContext context = new ApplicationDbContext(); 
        var userStore = new UserStore<ApplicationUser>(context);
        var userManager = new UserManager<ApplicationUser>(userStore);
        userManager.AddToRole(user.Id,role);
    }
}

这会将角色同步到用户和上下文数据库。 在注册新用户后的控制器中自动添加 rol "User" 代码:

// POST api/Account/Register
    [AllowAnonymous]
    [Route("Register")]
    public async Task<IHttpActionResult> Register(RegisterBindingModel model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };

        IdentityResult result = await UserManager.CreateAsync(user, model.Password);

        if (!result.Succeeded)
        {
            return GetErrorResult(result);
        }
        // Codigo de Ali para agregar el rol "User" al usuario inmediatamente es creado
        DAO.addRoleToUser(user, "User");
        return Ok();
    }

感谢 dawidr 帮助我深入研究这个问题。