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 帮助我深入研究这个问题。
您好。我看到了一千个问题,但我对每一个问题都迷失了……所以……基本上我在 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 帮助我深入研究这个问题。