Добавить утверждения в маркер-носитель Asp.Net Web API 2 в удостоверении ASP.net? - PullRequest
0 голосов
/ 27 февраля 2019

Можно ли добавить утверждения в токен на предъявителя, чтобы получить доступ к этим утверждениям в будущем?Это токен на предъявителя, который выдается веб-API.Он содержится в URL-адресе, который отображается при перенаправлении в процессе авторизации приложения Twitter.

Причина, по которой я спрашиваю, заключается в том, что я пытаюсь сохранить Twitter AccessToken и AccessTokenSecret в качестве дополнительных утверждений.Я делаю это так, чтобы я мог получить доступ к этим утверждениям, когда я получаю доступ к методу GetUserInfo, используя токен Bearer.Из того, что я могу сказать, это невозможно.

Кажется, что мне, возможно, придется хранить их в SQL и получать их, используя имя пользователя Twitter, когда я получаю доступ к GetUserInfo.Когда я получаю доступ к GetUserInfo, я получаю Twitter userName и userId, но не могу получить AccessToken и AccessTokenSecret.Возможно, мне удастся сохранить context.ScreenName, context.AccessToken и context.AccessTokenSecret в SQL с использованием общедоступного метода проверки подлинности задачи переопределения (контекст TwitterAuthenticatedContext).

Мне нужны AccessToken и AccessTokenSecret, поэтому я могу вызвать этоКонечная точка Twitter для получения адреса электронной почты пользователя.

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

На этом этапе мой пользователь не вошел в систему, и его локальная учетная запись не была создана.Я пытаюсь получить адрес электронной почты от Twitter, чтобы создать свою локальную учетную запись.

ОБНОВЛЕНИЕ 1

Вот некоторый код.Я вызываю этот метод из провайдера в TwitterAuthenticationOptions в Startup.Auth так.Как видите, я добавляю утверждения к контексту в Authenticated.

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);
    }

}

Любая помощь очень ценится.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

ОК, я наконец-то получил это на работу.Ключ находится в методе ExternalLoginData (см. Ниже).Этот метод вызывается, когда приложение перенаправляет обратно из Twitter, Facebook и т. Д. Я предполагаю, что это часть обратных вызовов https://api.yourdomain.com/signin-twitter и https://api.yourdomain.com/signin-facebook и т. Д.Основываясь на том, что я могу собрать, вернуть новые ExternalLoginData получает AccessToken и AccessTokenSecret.Затем вызывается 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

Надеюсь, это поможет кому-то еще, поскольку это вообще не задокументировано.:)

0 голосов
/ 28 февраля 2019

Вы не можете изменять токены, созданные сторонними разработчиками.
Они подписаны с помощью закрытого ключа и проверены при входе в систему.

Вы можете поместить хост IdentityServer между идентификатором Twiiter и вашими приложениями.,IdentityServer - это сервер OpenId и OAuth 2.0 с открытым исходным кодом, позволяющий определять, как следует обрабатывать токены и утверждения.Но это не простая вещь для начала.Все зависит от того, как далеко вы хотите пойти для этого решения.

https://identityserver.io/

Я, безусловно, могу порекомендовать его!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...