繁体   English   中英

检查基于Owin的MVC5声明

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM