【问题标题】:MVC5 - using Roles in controllersMVC5 - 在控制器中使用角色
【发布时间】:2014-03-11 07:08:51
【问题描述】:
不胜感激有关此主题的帮助:
我正在尝试使用我自己的角色,就像我在 MVC4(自定义成员资格)IE 上所做的那样。 [Authorize(roles="Admin")] 用于某些控制器。
我对新的 Identity 有点困惑。
稍后,我还需要为 API 控制器使用相同的角色。
有人可以解释我如何以最简单的方式实现以下目标:
- 从我的 SQL DB(实体)中读取“登录”类,该类具有用户名、密码和角色。 (角色是角色的枚举,{Admin = 1, Manager = 2...}
- 使用我登录中的角色,并将其转换为与新的“身份”一起使用。
- 使用 [Authorize(roles="Admin")]、[AllowAnonymous] 等管理常规控制器
- 用同样的东西管理 API 控制器。
我已经阅读了有关自定义的内容,但似乎太复杂了。
谁有一个简单的例子说明如何简单明了地使用它?
谢谢
【问题讨论】:
标签:
authorization
asp.net-mvc-5
roles
identity
【解决方案1】:
我会这样做:
// Just for Reference
public interface IUserIdentity
{
Guid UserId { get; set; }
string UserName { get; set; }
}
传入一个包含你的角色的列表..
List<Claim> claims = new List<Claim>();
claims.Add(new Claim(ClaimType.Role,"Admin"));
public ClaimsIdentity CreateIdentity(IUserIdentity user, IEnumerable<Claim> claims, string authenticationType)
{
var identity = new ClaimsIdentity(claims, authenticationType);
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.UserId.ToString()));
identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));
return identity;
}
如果您使用的是 ASP.NET Identiy,这可以轻松完成。 “开箱即用”的会员资格仍然很烂。
【解决方案2】:
如果您已经拥有自己的身份系统,那么使用 ASP.NET Identity 的原因是什么?您需要索赔支持吗?
ASP.NET Identity 可以完成您描述的所有事情,但是很难将其集成到现有的会员系统中(因为 ASP.NET Identity 是作为 ASP.NET 平台上现有会员框架的替代品而开发的)。你的角色系统有什么特别的吗?是否集成了任何业务规则?如果没有,将您的角色系统转换为 ASP.NET Identity 提供的角色系统应该不难。
我将尝试从 ASP.NET 身份的角度回答您的观点:
- 这由IdentityUser 类处理。在那里您会找到 Roles、UserName 和 PasswordHash 属性。如果您想自定义它,您可以在派生类中添加新属性。请记住,Roles 属性是 IdentityUserRoles 的集合,这意味着没有内置枚举(而是指向 IdentityRole 类)。
- 没有必要(见第 1 点)。
- 可以从 ASP.NET 标识中使用。工作方式与以前相同。
- 工作方式与以前相同。