Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从ASP.NET Web API方法中找到声明的内容?_Asp.net_Asp.net Web Api_Asp.net Identity_Claims Based Identity - Fatal编程技术网

如何从ASP.NET Web API方法中找到声明的内容?

如何从ASP.NET Web API方法中找到声明的内容?,asp.net,asp.net-web-api,asp.net-identity,claims-based-identity,Asp.net,Asp.net Web Api,Asp.net Identity,Claims Based Identity,在我的代码(ASP.NET Identity 2.1)中,我设置声明如下: public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) { var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

在我的代码(ASP.NET Identity 2.1)中,我设置声明如下:

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
        ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);
        if (user == null)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return;
        }
        ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
           OAuthDefaults.AuthenticationType);
        ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
            CookieAuthenticationDefaults.AuthenticationType);
        AuthenticationProperties properties = CreateProperties(
            user.UserName,
            oAuthIdentity,
            user.FirstName,
            user.LastName,
            user.Organization);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);
        context.Request.Context.Authentication.SignIn(cookiesIdentity);
    }
我可以看到self.data.roles正确地填充了角色。现在回到服务器上,我想检查角色声明的内容。有人能告诉我怎么做吗?我知道我可以用一种方法做到以下几点:

    [HttpGet]
    [Route("Retrieve")]
    public async Task<IHttpActionResult> Retrieve()
    {

        var x = User;
但在x中,我找不到有关索赔本身的信息

请注意,我确实尝试过之前发布的建议,所以:

        var identity = (ClaimsIdentity)User.Identity;
        IEnumerable<Claim> claims = identity.Claims;

        // The following line returns null
        var roles = identity.Claims.Where(r => r.Type == "roles").FirstOrDefault();
var-identity=(ClaimsIdentity)User.identity;
IEnumerable claims=identity.claims;
//下一行返回null
var roles=identity.Claims.Where(r=>r.Type==“角色”).FirstOrDefault();
但我仍然无法在声明中找到与角色相关的信息。我知道它一定在那里,因为它到达客户

请注意,我正在寻找“角色”索赔具体。没有任何系统生成的索赔。但我试图添加自己的那个,它包含一个连接的角色列表

你试过这个吗

var-roleClaims=identity.Claims.Where(c=>c.Type==ClaimTypes.Role)

更新

首先,您没有添加索赔。您正在将一些数据添加到
AuthenticationTicket
的属性字典中。这些数据恰好是逗号分隔的角色,您选择命名的键是“角色”。因此,这不是一项索赔

当你说它不适用于我时,我相信你想找到你放在字典中的逗号分隔值。如果是这种情况,则无法从控制器中的
User
检索它。当您发送承载令牌时,承载令牌认证中间件读取令牌,从令牌中获取
ClaimsIdentity
,并在上下文中进行设置,以便您可以从
User
读取该令牌

您在
AuthenticationTicket
中输入的任何内容都是供中间件(实际上是处理程序)使用的。因此,如果您想从
AuthenticationTicket
获取任何数据,您需要自己在承载中间件上调用
authenticateSync
。通过执行
var result=wait AuthenticationManager.authenticateSync(OAuthDefaults.AuthenticationType),您现在获得的是整张票,而不仅仅是
索赔
。通过查看
结果
,您应该能够获得逗号分隔的角色,但随后要了解,承载中间件已经为您完成了一次,您将再次调用它

顺便说一句,如果要添加自定义声明,则需要将其添加到
GrantResourceOwnerCredentials
中的
OAuthidentials

public override async Task GrantResourceOwnerCredentials(
                            OAuthGrantResourceOwnerCredentialsContext context)
{
    // snip
    ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
           OAuthDefaults.AuthenticationType);
    oAuthIdentity.AddClaim(new Claim("urn:roles", "a,b,c");
}
如果您这样做,您可以从
User
读取


var myRoleClaims=identity.Claims.Where(c=>c.Type==“urn:roles”)

我认为问题在于您看到了错误的authenticationType,User.Identity映射到cookie和“活动”authenticationType,即CookieAuthenticationDefaults.authenticationType

要查看角色的ClaimsEntity,您可能需要调用IAAuthenticationManager.Authentication(OAuthDefaults.AuthenticationType),然后我想您将看到您期望的角色声明

编辑:添加了一个示例

    var result = await AuthenticationManager.AuthenticateAsync(OAuthDefaults.AuthenticationType);
    // do something with result.Identity

这对我不起作用。我想查找我自己添加的声明的内容,而不是添加了ClaimTypes.Role的声明的内容。谢谢,谢谢你的建议。我真希望有更多的例子。我花了很多时间查看不同的web链接,但没有发现任何最新的链接,而且技术变化如此之快,我很难跟上。你能给我一个我需要称之为的例子吗。我需要把这个放在控制器里吗?如果你能给我一个3-4行代码的例子,那么我可以试试。谢谢。当然,您应该能够在控制器中执行类似的操作,以获取索赔标识。将进入数据库吗?我希望将“角色”声明发送到浏览器,然后每次都将其返回到服务器,并使其可供我获取,但不能从数据库获取?不,这不会进入数据库,它只会命中您为authtype配置的任何auth中间件,即OAuth.AuthenticationType中间件
        var identity = (ClaimsIdentity)User.Identity;
        IEnumerable<Claim> claims = identity.Claims;

        // The following line returns null
        var roles = identity.Claims.Where(r => r.Type == "roles").FirstOrDefault();
public override async Task GrantResourceOwnerCredentials(
                            OAuthGrantResourceOwnerCredentialsContext context)
{
    // snip
    ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
           OAuthDefaults.AuthenticationType);
    oAuthIdentity.AddClaim(new Claim("urn:roles", "a,b,c");
}
    var result = await AuthenticationManager.AuthenticateAsync(OAuthDefaults.AuthenticationType);
    // do something with result.Identity