[英]Check Owin based claim on MVC5
我的User.IsInRole("CanChangeData")
无法正常工作,但是我在调试菜单中看到Value 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")
没有抓住要求?
当使用声明时,以此为例,您可以这样添加声明:
identity.AddClaim(new Claim("ThisIsTheClaimID", "This is the value"));
然后,您可以使用以下代码进行检索:
var myClaimValue = User.FindFirst("ThisIsTheClaimID").Value
希望这可以帮助?
您可以获取相关的索赔值,例如以下代码,
var identity = (ClaimsIdentity) User.Identity;
var claims = identity.Claims.ToList();
if (claims.Any(x = > x.ClaimType == ClaimTypes.Role && x.ClaimValue == "CanChangeData"))
{
...
}
我使用以下代码按其类型获取声明:
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);
根据您的情况,您可以将它们抽象为更简洁的方法。 通常,我在索赔中存储了更复杂的数据类型,因此我进行这些检查的支持方法更加个性化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.