将索赔添加到ASP.NET身份中的ASP.NET Web API 2承载令牌



是否可以将索赔添加到携带者令牌中以将来访问这些索赔?这是Web API发出的承载令牌。它包含在Twitter应用程序授权过程中重定向时显示的URL中。

我问的原因是我正在尝试将Twitter AccessToken和AccessTokenSecret作为其他索赔存储。我正在这样做,以便在使用携带者令牌访问getuserinfo方法时可以访问这些主张。据我所知,这是不可能的。

似乎我可能必须将它们存储在SQL中,并在访问GetUserInfo时使用Twitter用户名来检索它们。当我访问GetUserInfo时,我会获得Twitter用户名和用户ID,但是我无法获得访问和访问tockeTokenSecret。我也许可以使用public override任务验证(twitterauthenticatiCatedContext上下文)方法。

我需要AccessToken和AccessTokenSecret,因此我可以调用此Twitter端点以获取用户的电子邮件地址。

https://api.twitter.com/1.1/account/verify_credentials.json

在此过程中的这个阶段,我的用户未登录,尚未创建其本地帐户。我正在尝试从Twitter获取电子邮件地址以创建其本地帐户。

更新1

这是一些代码。我正在启动中的TwitterAuthenticationOptions中的提供商来调用此方法。如您所见,我将主张添加到身份验证的上下文中。

Provider = new TwitterAuthProvider(), 
public class TwitterAuthProvider : TwitterAuthenticationProvider
{
    public string XmlSchemaString { get; private set; }
    public override Task Authenticated(TwitterAuthenticatedContext context)
    {
        context.Identity.AddClaim(new Claim("access_token", context.AccessToken, XmlSchemaString, "Twitter"));
        context.Identity.AddClaim(new Claim("access_token_secret", context.AccessTokenSecret, XmlSchemaString, "Twitter"));
        context.Identity.AddClaim(new Claim("user_name", context.ScreenName, XmlSchemaString, "Twitter"));
        context.Identity.AddClaim(new Claim("account_type", "Twitter", XmlSchemaString, "Twitter"));
        return Task.FromResult<object>(null);
    }
}

任何帮助都非常感谢。预先感谢!

您无法更改第三方制作的令牌。
它们用私钥签名并在登录时进行验证。

您可以将主机身份服务器放在Twiiter Identity Prodiver和您的应用程序之间。IdentityServer是开源OpenID和OAuth 2.0服务器,允许您指定应处理令牌和索赔的方式。但这不是一件简单的事情。这一切都取决于您想走多远。

https://indistityserver.io/

我当然可以推荐它!

好吧,我终于让这个工作了。关键是在外部godata方法中(见下文)。当应用程序从Twitter,Facebook等重定向时,该方法被调用...我认为这是https://api.yourdomain.com/signin-twitter和https://api.yourdomain.com/signin-com.com/signin--Facebook等...回调。根据我可以收集的内容,返回新的外部gogindata获得了访问和访问。然后叫GetClaims。如果AccessToken和AccessTokenSecret并非null,则将其重新添加为索赔。然后,可以使用此代码行在GetuserInfo或registerexternal方法中访问这些声明。

ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity). 

您可以使用此代码获得确切的值。

AccessToken = externalLogin != null ? externalLogin.AccessToken : null,
                    AccessTokenSecret = externalLogin != null ? externalLogin.AccessTokenSecret : null

这是新的externallogindata方法。

private class ExternalLoginData
        {
            public string LoginProvider { get; set; }
            public string ProviderKey { get; set; }
            public string UserName { get; set; }
            public string AccessToken { get; set; }
            public string AccessTokenSecret { get; set; }

            public IList<Claim> GetClaims()
            {
                IList<Claim> claims = new List<Claim>();
                claims.Add(new Claim(ClaimTypes.NameIdentifier, ProviderKey, null, LoginProvider));
                if (UserName != null)
                {
                    claims.Add(new Claim(ClaimTypes.Name, UserName, null, LoginProvider));
                }
                if (AccessToken != null)
                {
                    claims.Add(new Claim("access_token", AccessToken, null, LoginProvider));
                }
                if (AccessTokenSecret != null)
                {
                    claims.Add(new Claim("access_token_secret", AccessTokenSecret, null, LoginProvider));
                }
                return claims;
            }
            public static ExternalLoginData FromIdentity(ClaimsIdentity identity)
            {
                if (identity == null)
                {
                    return null;
                }
                Claim providerKeyClaim = identity.FindFirst(ClaimTypes.NameIdentifier);
                if (providerKeyClaim == null || String.IsNullOrEmpty(providerKeyClaim.Issuer)
                    || String.IsNullOrEmpty(providerKeyClaim.Value))
                {
                    return null;
                }
                if (providerKeyClaim.Issuer == ClaimsIdentity.DefaultIssuer)
                {
                    return null;
                }
                return new ExternalLoginData
                {
                    LoginProvider = providerKeyClaim.Issuer,
                    ProviderKey = providerKeyClaim.Value,
                    UserName = identity.FindFirstValue(ClaimTypes.Name),
                    AccessToken = identity.Claims.FirstOrDefault(x => x.Type.Contains("access_token")).Value,
                    AccessTokenSecret = identity.Claims.FirstOrDefault(x => x.Type.Contains("access_token_secret")).Value,
                };
            }
        }

然后我使用公共静态Twitterdto TwitterLogin方法从Twitter获取电子邮件地址(请参阅下面的链接)。

https://stackoverflow.com/a/36356009/5360237

希望,这将对其他人有所帮助,因为这根本没有记录下来。:)

相关内容

  • 没有找到相关文章