2016-04-22 61 views
6

我的角色administrators添加到用户声明身份验证后,用IClaimsTransformer impelimentation这样的:的User.IsInRole(“管理员”)与IClaimsTransformer总是假

(principal.Identity as ClaimsIdentity).AddClaim(new Claim(ClaimTypes.Role, "Administrators")); 但是,当我在剃刀称之为User.IsInRole("Administrators")查看它的回报假。

+0

做你尝试加入的要求是完全一样的?也就是说,我不会认为这是不区分大小写 –

+0

是。我在调试时看到用户声明中的角色。 –

+0

你有没有试过.HasClaim看看它有什么不同?你确定在转型后检查索赔吗? –

回答

1

我在基于API的解决方案中做了类似的事情,但是我在创建用户时设置了角色声明,而不是在变压器中。

看过User.IsInRole()documentation之后,看起来这种方法设计为首先从缓存中取出。

IsInRole首先检查IsRoleListCached属性,以确定 角色名称的当前用户缓存列表是否可用。 如果IsRoleListCached属性为true,则为指定角色检查缓存列表 。如果IsInRole方法在高速缓存列表中找到指定的 角色,则它将返回true。如果IsInRole找不到 指定的角色,则它会调用默认的 提供程序实例的GetRolesForUser方法,以确定用户名是否与来自数据源的角色关联的 与配置的ApplicationName 值关联。

我怀疑由于ClaimTypes.Role是一种常见的权利要求,而不是自定义域特定的权利要求(我相信是用例用于ClaimsTransformer),应用程序使用默认情况下,高速缓存的,预变换值。

尽管如此,其中大部分是猜测。您可以在创建用户时尝试设置声明。我使用UserManager类来完成它。

var claimsResult = await _userManager.AddClaimAsync(applicationUser, new Claim(ClaimsIdentity.DefaultRoleClaimType, "Administrator"));