Identity Server 6 Неверный Uri перенаправления с клиентом WinForms

Попытка создать интерактивную форму входа в приложение NET 6 WinForms с использованием Identity Server 6, но во многом вдохновленная примером клиента Winforms, приведенным здесь: https://github.com/IdentityModel/IdentityModel.OidcClient.Samples/tree/main/WinFormsWebView2/WinFormsWebView2

Получение этой ошибки в клиентском «браузере»:

Извините, произошла ошибка: valid_request Неверный redirect_uri.

На локальной консоли проекта IS6 отображается такая ошибка:

[23:04:00 Ошибка]Duende.IdentityServer.Validation.AuthorizeRequestValidator Неверный redirect_uri: http://localhost/winforms.client

       {
    "ClientId": "vr2-win-client",
    "ClientName": null,
    "RedirectUri": null,
    "AllowedRedirectUris": [],
    "SubjectId": "anonymous",
    "ResponseType": null,
    "ResponseMode": null,
    "GrantType": null,
    "RequestedScopes": "",
    "State": null,
    "UiLocales": null,
    "Nonce": null,
    "AuthenticationContextReferenceClasses": null,
    "DisplayMode": null,
    "PromptMode": "",
    "MaxAge": null,
    "LoginHint": null,
    "SessionId": null,
    "Raw": {
       "response_type"        : "code",
       "state"                : "IdqJr9LGl9n_0lcl0LlTVA",
       "code_challenge"       : "v7Bjclv_Ivn7Kltp-7iCOCqdUZxJIxVSf27Ecau2G2o",
       "code_challenge_method": "S256",
       "client_id"            : "vr2-win-client",
       "scope"                : "vr2-client-api offline_access openid",
       "redirect_uri"         : "http://localhost/winforms.client"
    }
},
"$type": "AuthorizeRequestValidationLog"
}

[23:04:00 Ошибка] Duende.IdentityServer.Endpoints.AuthorizeEndpoint Не удалось выполнить проверку запроса

Я не могу понять, почему, поскольку указанные URI перенаправления точно совпадают. [Кстати, небольшой стон: этот бизнес с серверами идентификации поразительно сложен в правильном понимании и с ним трудно работать. Я занимаюсь этим уже несколько недель, и все, что я хочу сделать, это защитить один API на серверной части и предоставить интерактивный вход в систему на внешней стороне; Должен быть более простой способ]

Это код в моей конфигурации IS-клиента:

      public static IEnumerable<Client> Clients =>
        new List<Client>
        {
            new Client
            {
                ClientId = "vr2-win-client",
             
                AllowedScopes = new List<string>
                {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile
                },

                RequireClientSecret = false,
                AllowedGrantTypes = GrantTypes.Code,
                RequirePkce = true,
                RedirectUris = { "https://notused", "http://localhost/winforms.client" },
                PostLogoutRedirectUris = { "https://notused" },
                AllowOfflineAccess = true,
                RequireConsent = false

                // scopes that client has access to
                //AllowedScopes = { "vr2-client-api" }
            }
        };

И в коде на стороне клиента у меня есть это:

      private async void LoginBtn_Click(object sender, EventArgs e)
        {
            var oidcOptions = new OidcClientOptions
            {
                Authority = config["IdentityServerAddress"].ToString(),
                ClientId = "vr2-win-client",
                Scope = "vr2-client-api offline_access openid",
                RedirectUri = "http://localhost/winforms.client",
                Browser = this.loginWebForm
            };
            
            OidcClient _oidcClient = new OidcClient(oidcOptions);
                        
            LoginResult loginResult = await _oidcClient.LoginAsync();

            if (loginResult.IsError)
            {
                MessageBox.Show(loginResult.Error, "Login", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            this.accessTokenLifetimeManager = new AccessTokenLifetimeManager
                (loginResult, 600, cancellationOnExitTokenSource.Token, config);

            var refreshTokenTask = Task.Run(accessTokenLifetimeManager.PeriodicallyRefreshAccessTokensWorkerTaskAsync);

            vr2Button.Enabled = true;
        } 

Я использую IdentityModel.OidcClient v5.2.1 на стороне клиента и Identity Server v6.3.2.

Я очень благодарен за любые идеи относительно того, что я пропустил или что я здесь делаю неправильно. Предположительно, должно быть дополнительное требование проверки (для URL-адреса перенаправления), которое не описано в сообщениях об ошибках, любые указатели будут высоко оценены.

Спасибо

0 ответов

Другие вопросы по тегам