Asp.net 对地方当局索赔和外部供应商索赔的混淆
我正在创建一个简单的WebApi,允许用户连接Facebook。当我从facebook获得accessToken时,我正在调用RegisterExternal来创建一个Asp.Net身份记录并存储来自该令牌的声明。这些声明还包括我稍后查询facebook图表所需的访问令牌。到目前为止,一切似乎都很好 我面临的问题是阅读声明。我可以看到它们在我的数据库中,我只是不知道如何查询这些数据。我试过了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
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 你知道他们从哪里来了吗?没有。仍然在努力解决这个问题,并最终创建了我自己的属性来对抗该成员以保存一些数据