Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.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 对地方当局索赔和外部供应商索赔的混淆_Asp.net_Facebook_Asp.net Web Api_Oauth 2.0_Claims Based Identity - Fatal编程技术网

Asp.net 对地方当局索赔和外部供应商索赔的混淆

Asp.net 对地方当局索赔和外部供应商索赔的混淆,asp.net,facebook,asp.net-web-api,oauth-2.0,claims-based-identity,Asp.net,Facebook,Asp.net Web Api,Oauth 2.0,Claims Based Identity,我正在创建一个简单的WebApi,允许用户连接Facebook。当我从facebook获得accessToken时,我正在调用RegisterExternal来创建一个Asp.Net身份记录并存储来自该令牌的声明。这些声明还包括我稍后查询facebook图表所需的访问令牌。到目前为止,一切似乎都很好 我面临的问题是阅读声明。我可以看到它们在我的数据库中,我只是不知道如何查询这些数据。我试过了 var claimsIdentity = User.Identity as ClaimsIdentity

我正在创建一个简单的WebApi,允许用户连接Facebook。当我从facebook获得accessToken时,我正在调用RegisterExternal来创建一个Asp.Net身份记录并存储来自该令牌的声明。这些声明还包括我稍后查询facebook图表所需的访问令牌。到目前为止,一切似乎都很好

我面临的问题是阅读声明。我可以看到它们在我的数据库中,我只是不知道如何查询这些数据。我试过了

var claimsIdentity = User.Identity as ClaimsIdentity;
但这给了我2次索赔 a) “” b) 角色

这两个都是发行人地方当局的(老实说,我不确定它们是什么时候创建的,因为我没有明确地添加它们)。因此,我认为他们要么对我感到困惑,要么将索赔保存到数据库中,要么对错误类型的发行人进行攻击

await userManager.AddClaimAsync(user.Id, new Claim("urn:facebook:access_token", accessTokenClaim.Value, ClaimValueTypes.String, "LOCAL AUTHORITY"));
或者我访问索赔的代码不正确


有谁能解释一下这一点吗?

当涉及到为您的身份添加声明时:

// Get the claims identity
    ClaimsIdentity claimsIdentity =
        await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);

    if (claimsIdentity != null)
    {
        // Retrieve the existing claims
        var currentClaims = await UserManager.GetClaimsAsync(user.Id);

        // Get the list of access token related claims from the identity
        var tokenClaims = claimsIdentity.Claims
            .Where(c => c.Type.StartsWith("urn:tokens:"));

        // Save the access token related claims
        foreach (var tokenClaim in tokenClaims)
        {
            if (!currentClaims.Contains(tokenClaim))
            {
                await UserManager.AddClaimAsync(user.Id, tokenClaim);
            }
        }
    }
要将这些声明保留到数据库,必须为用户调用SignIn:

// Sign in and redirect the user
    await SignInAsync(user, isPersistent: false);
要在以后检索索赔,只需使用:

var claimsIdentity = HttpContext.User.Identity as ClaimsIdentity;
if (claimsIdentity != null)
   var claims = claimsIdentity.Claims;
此代码由本文中的片段组成:


如果你想看完整的例子,我建议你通读一遍。我自己也在本文中使用了这段代码,它在我的项目中对Twitter和Facebook的外部声明都非常有效。

我在重命名identity cookie时也遇到了同样的问题。所以我在两个cookie中有两个不同的用户。在我删除后,旧的一个问题就消失了。

如果在创建索赔时未指定,则本地机构是发行人的默认值。例如: var索赔=新索赔(“LastName”、“Timberlake”、“string”、“http:/contoso.com/someissuername”);
上例中的最后一个参数是issuer

你知道他们从哪里来了吗?没有。仍然在努力解决这个问题,并最终创建了我自己的属性来对抗该成员以保存一些数据