检查Owin对MVC5的索赔

时间:2015-09-22 14:04:39

标签: c# asp.net-mvc owin

我的User.IsInRole("CanChangeData")无效,但我可以在调试菜单中看到值CanChangeData位于用户的声明列表中。

enter image description here

如果用户无法更改布局中的数据,我想删除菜单,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")没有抓住声明?

3 个答案:

答案 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);

根据您的情况,您可以将这些抽象为更简洁的方法。通常我会在索赔中存储更复杂的数据类型,因此我的支持方法可以更加自定义。