我的User.IsInRole("CanChangeData")
无效,但我可以在调试菜单中看到值CanChangeData
位于用户的声明列表中。
如果用户无法更改布局中的数据,我想删除菜单,if
返回false。 Request.IsAuthenticated
返回true。
这就是我在AuthenticationController
var identity = new ClaimsIdentity(new[] {
new Claim(ClaimTypes.Name, input.Username),
},
DefaultAuthenticationTypes.ApplicationCookie,
ClaimTypes.Name, ClaimTypes.Role);
var employe = db.Employes.Single(k => k.User == input.Username);
foreach (var permission in employe.Role.Permissions)
{
identity.AddClaim(new Claim(ClaimTypes.Role, permission.Nom));
}
为什么User.IsInRole("CanChangeData")
没有抓住声明?
答案 0 :(得分:1)
当您使用声明时,以此为例,您可以添加声明:
identity.AddClaim(new Claim("ThisIsTheClaimID", "This is the value"));
然后您可以使用以下代码来检索它:
var myClaimValue = User.FindFirst("ThisIsTheClaimID").Value
希望这有帮助吗?
答案 1 :(得分:1)
您可以获取相关的声明值,例如以下代码
var identity = (ClaimsIdentity) User.Identity;
var claims = identity.Claims.ToList();
if (claims.Any(x = > x.ClaimType == ClaimTypes.Role && x.ClaimValue == "CanChangeData"))
{
...
}
答案 2 :(得分:0)
我使用以下代码按类型获取声明:
public string GetClaimByClaimType(string claimType)
{
return ((ClaimsPrincipal) Thread.CurrentPrincipal)
.Claims
.Where(c => claimType == c.Type)
.Select(c => c.Value)
.SingleOrDefault() ?? string.Empty;
}
在您的特定情况下,因为您将其称为:
// I would recommend using a custom claim type instead of the MS schema name
var hasCanChangeDataRole =
GetClaimByClaimType("http://schemas.microsoft.com/ws/2008/06/identity/claims/role");
var canChangeData =
"canChangeData".Equals(hasRole, StringComparison.OrdinalIgnoreCase);
根据您的情况,您可以将这些抽象为更简洁的方法。通常我会在索赔中存储更复杂的数据类型,因此我的支持方法可以更加自定义。