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-адреса перенаправления), которое не описано в сообщениях об ошибках, любые указатели будут высоко оценены.
Спасибо