C# 获取外部索赔身份信息
我正在使用OWIN Oauth Instagram使用以下代码登录我的MVC 5应用程序:C# 获取外部索赔身份信息,c#,asp.net-mvc,C#,Asp.net Mvc,我正在使用OWIN Oauth Instagram使用以下代码登录我的MVC 5应用程序: Startup.Auth.cs app.UseInstagramAuthentication(new InstagramAuthenticationOptions() { ClientId = "myCID", ClientSecret = "mySecret", SignInAsA
Startup.Auth.cs
app.UseInstagramAuthentication(new InstagramAuthenticationOptions()
{
ClientId = "myCID",
ClientSecret = "mySecret",
SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie,
Provider = new InstagramAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
context.Identity.AddClaim(new Claim("igAccessToken", context.AccessToken));
context.Identity.AddClaim(new Claim("igFullName", context.FullName));
context.Identity.AddClaim(new Claim("igProfilePic", context.ProfilePicture));
context.Identity.AddClaim(new Claim("igUsername", context.UserName));
foreach (var claim in context.User)
{
var claimType = string.Format("{0}", claim.Key);
string claimValue = claim.Value.ToString();
if (!context.Identity.HasClaim(claimType, claimValue))
context.Identity.AddClaim(new Claim(claimType, claimValue, "XmlSchemaString", "Instagram"));
}
return Task.FromResult(0);
}
}
});
登录工作正常,我可以通过添加新列来分别保存数据,从而将这些信息存储在AspNetUserRoles表中,但我认为这不是最好的方法,也不知道如何访问这些信息。如何通过以下方式访问此数据:
SomeController.cs
var info = await AuthenticationManager.GetExternalLoginInfoAsync();
var pic = info.ExternalIdentity.Claims.First(c => c.Type == "igProfilePic").Value;
var fullName = info.ExternalIdentity.Claims.First(c => c.Type == "igFullName").Value;
var accessToken = info.ExternalIdentity.Claims.First(c => c.Type == "igAccessToken").Value;
上面的代码抛出一个未设置为对象实例的对象引用。
调试后,信息上下文中没有任何内容使我相信声明从未存储在外部性上下文中
注意:有很多类似的问题,但它们似乎过时了,对我来说不起作用,因为我的很多代码都是从这些问题中借用来的。您应该能够访问
AccountController
的外部登录确认
方法中的GetExternalLoginFoAsync
,请参阅。在这里,索赔应可用于进一步处理,例如,在必要时手动将索赔添加到数据库中
如果已将声明添加到IdentityUserClaim
表中,则您应该能够使用以下方式在其他控制器操作(也请参见此)中访问它们:
IEnumerable claims=(ClaimsIdentity)User.Identity.claims;
更多信息可在中找到。您尝试过吗?有关更多信息,请参阅。我尝试在您链接的答案中添加ienumerable代码,并对其进行了调试。我没有看到Instagram的任何声明,只是一些地方当局的声明。我也读了这篇文章。根据我对这篇文章的理解,它说外部cookie数据被存储,然后转换为应用程序cookie数据,应用程序cookie数据应该可以访问,但在我的情况下不是这样。我相信这就是问题所在。在创建声明时调试代码,就是添加声明,在声明中我可以添加到DB中,并可以在DB中查看它。您能描述一下在此上下文中如何使用AspNetUserRoles吗?你能吗?@user7217806谢谢!你的第二个链接帮我弄明白了。起初,我注意到了这一点,但并不认为这有什么关系,因为在查看AspNetUserClaims表时,没有数据。因此,在Startup.Auth中添加声明后,我可以使用ExternalIdentityClaims对象从AccountController ExternalLoginConfirmation方法访问它,我可以将该对象添加到DB中,但在移出此范围后,我无法访问它。我的解决方法是手动将声明再次添加到UserManager中,然后填充我可以访问的AspNetUserClaims表。如果您想要制定答案,我将向上投票并接受。
IEnumerable<Claim> claims = (ClaimsIdentity)User.Identity.Claims;