Xamarin.forms аутентификация PKCE - PullRequest
       46

Xamarin.forms аутентификация PKCE

0 голосов
/ 26 сентября 2019

У меня есть приложение Identity Server 4, в которое я пытаюсь войти, используя мое приложение Xamarin.forms, используя PKCE.Я продолжаю получать сообщение об ошибке от сервера идентификации, которого я на самом деле не видел раньше.code_challenge is missing Я предполагаю, что я использую неправильный тип предоставления, но вся документация, которую я нашел для Xamarin, говорит, что я должен использовать этот.

Как подключить Xamarin к серверу удостоверений 4?

Ошибка

fail: IdentityServer4.Validation.AuthorizeRequestValidator[0]
      code_challenge is missing
{
        "ClientId": "xamarin",
        "ClientName": "eShop Xamarin OpenId Client",
        "RedirectUri": "1046123799103-h63f9o1cnj78fo26okng1aacr9e89u2e:/oauth2redirect",
        "AllowedRedirectUris": [
          "http://localhost:5001/signin-oidc"
        ],
        "SubjectId": "anonymous",
        "ResponseType": "code",
        "ResponseMode": "query",
        "GrantType": "authorization_code",
        "RequestedScopes": "",
        "State": "egfczresvcjyeerw",
        "Raw": {
          "client_id": "xamarin",
          "redirect_uri": "1046123799103-h63f9o1cnj78fo26okng1aacr9e89u2e:/oauth2redirect",
          "scope": "profile openid nol_api navinfo",
          "response_type": "code",
          "state": "egfczresvcjyeerw"
        }
      }

Идентификатор клиента на сервере удостоверений

new Client
            {
                ClientId = "xamarin",
                ClientName = "eShop Xamarin OpenId Client",
                AllowedGrantTypes = GrantTypes.Code,

                RedirectUris = { "http://localhost:5001/signin-oidc" },
                RequireConsent = false,
                RequirePkce = true,
                PostLogoutRedirectUris = { "http://localhost:8008/Account/Redirecting" },
                AllowedScopes = new List<string>
                {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    "navinfo",
                    $"{nolConfig.Client}_api"
                },
                AllowOfflineAccess = true,
                AllowAccessTokensViaBrowser = true,
                RequireClientSecret = false
            }

xamarin code

Authenticator = new OAuth2Authenticator
            (
                _clientId,
                _secret,
                _scopes,
                new Uri(_discoveryDoc.AuthorizationEndpoint),
                _redirectUri,
                new Uri(_discoveryDoc.TokenEndpoint),
                null,
                isUsingNativeUI: true
            );

Если я удаляю RequirePkce = true, с клиента на сервере идентификации, я больше не получаю соответствующую ошибку.Из того, что я смог найти, можно сказать, что Xamarin.auth пока не поддерживает PKCE.Это означает, что мне придется либо отключить его, либо внедрить самому.

Как выполнить вход в Identity Server 4 из форм XAmarin с включенным PKCE.

1 Ответ

0 голосов
/ 28 сентября 2019

Похоже, что PKCE включен в OAuth2Authenticator из-за отсутствия секрета клиента:

    protected bool IsProofKeyCodeForExchange
    {
        get
        {
            return
                accessTokenUrl != null                    // AccessToken url is defined
                &&
                string.IsNullOrWhiteSpace(clientSecret)   // Client Secret is not defined
                ;
        }
    }

Так что я бы попробовал

Authenticator = new OAuth2Authenticator
        (
            _clientId,
            null,
            _scopes,
            new Uri(_discoveryDoc.AuthorizationEndpoint),
            _redirectUri,
            new Uri(_discoveryDoc.TokenEndpoint),
            null,
            isUsingNativeUI: true
        );
...