我有这个代码来授权用户:
public enum Role {
Admin,
User
}
public class AuthorizeRolesAttribute : AuthorizeAttribute
{
private Role[] _roles;
public AuthorizeRolesAttribute(params Role[] roles)
{
_roles = roles;
}
protected override bool IsAuthorized(HttpActionContext actionContext)
{
ClaimsIdentity claimsIdentity;
var httpContext = HttpContext.Current;
if (!(httpContext.User.Identity is ClaimsIdentity))
{
return false;
}
claimsIdentity = httpContext.User.Identity as ClaimsIdentity;
var roleId = claimsIdentity.FindFirst("RoleId");
if (_roles == null)
{
// just extra defense, not sure it should happen
return false;
}
// This line fails
return _roles.Contains(roleId);
}
}
检查以下内容:
[AuthorizeRoles(Role.Admin, Role.User)]
然而我感到困惑。 _roles包含Role类型的数组。而roleId是一个代表角色的数字。
我的包含内容的行已失败,显示此消息:
Error 2 'Entities.Enums.Role[]' does not contain a definition for 'Contains'
and the best extension method overload 'System.Linq.Queryable.Contains<TSource>
(System.Linq.IQueryable<TSource>, TSource)' has some invalid arguments
我怎样才能将roleId转换为一种角色,以便包含有效?
答案 0 :(得分:5)
contains方法需要枚举值
如果你的roldeId是一个整数。
您可以使用
_roles.Contains((Role)roleId);
如果是字符串,则需要使用Enum.Parse
和Enum.IsDefined
方法。
这是一个小片段:
class Program
{
static void Main(string[] args)
{
Role[] _roles;
_roles = new[] {Role.Admin, Role.User};
Console.WriteLine( _roles.Contains((Role)0)); // True
Console.WriteLine(_roles.Contains((Role)1)); // True
Console.WriteLine(_roles.Contains((Role)2)); // False
Role role = (Role)Enum.Parse(typeof (Role), "Admin");
Console.WriteLine(_roles.Contains(role)); // True
}
public enum Role
{
Admin,
User,
Guest
}
}
希望这有帮助
答案 1 :(得分:0)
如果你的id是一个字符串,你可以这样写:
var roleId = "Admin";
var roleEnum = (Role)Enum.Parse(typeof(Role), roleId);
return _roles.Contains(roleEnum);