Ger Hayden Ответов: 1

Wpf identityserver4 недопустимый тип гранта для клиента: authorization_code


У меня снова проблемы с IdentityServer4! На этот раз подключился к WPF.

Как и сайт .NET Core, который сейчас успешно работает, я использую "гибрид", но в то время как веб-сайт возвращает тип гранта "authorization_code", приложение WPF падает. Это выписка из журнала:

Что я уже пробовал:

Это протоколированный вывод с моего IdentityServer:
Выберите [c0].[Id], [c0].[ClientId], [c0].[Перенаправление]]
ОТ (
SELECT TOP(@__p_1) [c].[Id], [c].[AbsoluteRefreshTokenLifetime], [c].[AccessTokenLifetime], [c].[AccessTokenType], [c].[AllowAccessTokensViaBrowser], [c].[AllowOfflineAccess], [c].[AllowPlainTextPkce], [c].[AllowRememberConsent], [c].[AlwaysIncludeUserClaimsInIdToken], [c].[AlwaysSendClientClaims], [c].[AuthorizationCodeLifetime], [c].[BackChannelLogoutSessionRequired], [c].[BackChannelLogoutUri], [c].[ClientClaimsPrefix], [c].[ClientId], [c].[ClientName], [c].[ClientUri], [c].[ConsentLifetime], [c].[Created], [c].[Description], [c].[DeviceCodeLifetime], [c].[EnableLocalLogin], [c].[Enabled], [c].[FrontChannelLogoutSessionRequired], [c].[FrontChannelLogoutUri], [c].[IdentityTokenLifetime], [c].[IncludeJwtId], [c].[LastAccessed], [c].[LogoUri], [c].[NonEditable], [c].[PairWiseSubjectSalt], [c].[ProtocolType], [c].[RefreshTokenExpiration], [c].[RefreshTokenUsage], [c].[RequireClientSecret], [c].[RequireConsent], [c].[RequirePkce], [c].[SlidingRefreshTokenLifetime], [c].[UpdateAccessTokenClaimsOnRefresh], [c].[Updated], [c].[UserCodeType], [c].[UserSsoLifetime]
От [клиентов] как [c]
Где [c].[Параметр ClientID] = @__параметр ClientID_0
) Как [t]
Внутреннее соединение [ClientRedirectUris] как [c0] на [t].[Id] = [c0].[значение ClientID]
dbug: IdentityServer4.EntityFramework.Магазины.ClientStore[0]
VTConsole найдено в базе данных: True
dbug: IdentityServer4.Stores.ValidatingClientStore[0]
проверка конфигурации клиента для клиента VTConsole прошла успешно.
dbug: IdentityServer4.Validation.AuthorizeRequestValidator[0]
Проверка параметров Эпсилон
ошибка: IdentityServer4.Validation.AuthorizeRequestValidator[0]
Недопустимый тип гранта для клиента: authorization_code
{
"ClientId": "VTConsole",
"Имя Клиента": "Клиент VTConsole",
"URI перенаправления": "http://localhost/VT_ConsoleCore",
"AllowedRedirectUris": [
"http://localhost/VT_ConsoleCore"
],
"SubjectId": "аноним",
"ResponseType": "код",
"ResponseMode": "запрос",
"GrantType": "authorization_code",
"RequestedScopes": "",
"Состояние": "pW44DAo0a5FM6jjnYCMaGQ",
"Вид сырья": {
"response_type": "код",
"nonce": "uddkyT-k7lbKpLfFArzmiw",
"состояние": "pW44DAo0a5FM6jjnYCMaGQ",
"code_challenge: данный параметр": "х-rkJyBEUWcS7_hrpVzsKQP5C-lC_Sd1Yll_xu195tA",
"code_challenge_method": "S256",
"client_id": "VTConsole",
"область применения": "LDH001 offline_access CMDS ",
"redirect_uri": "http://localhost/VT_ConsoleCore"
}
}
ошибка: IdentityServer4.Endpoints.AuthorizeEndpoint[0]
```

Запрос, записанный здесь, возвращает client_id 7 и URI перенаправления http://localhost/VT_ConsoleCore - оба, как и ожидалось

Запись в ClientGrantTypes для ID 7 является гибридной.

ClientScopes содержит записи для LDH001, offline_access и CMDS, но хотя LDH001 является новым, он присутствует в APIScopes и APIResources.

Вот как я вызываю IdentityServer4 из моего WPF codebehind:

var options = new OidcClientOptions
 {
     Authority = this.config.p_Authority,
     ClientId = this.config.p_ClientId,
     RedirectUri = "http://localhost/VT_ConsoleCore",

     Browser = new WpfEmbeddedBrowser()
 };
 foreach (CScopeMasterBase scope in this.scopes)
 {
     options.Scope+= $"{scope.p_AddScopeFor} ";
 }


 _oidcClient = new OidcClient(options);


Нужно ли что-то вроде AuthenticationFlow в опциях или что-то еще?

1 Ответов

Рейтинг:
1

Ger Hayden

Для этих параметров требуется следующая дополнительная запись

Flow = OidcClientOptions.AuthenticationFlow.Hybrid,


Последний вызов сервера идентификации из WPF-это:
this.scopes = new List<CScopeMasterBase>();
 scopes = this.ldh.GetScopes(this.config.p_ClientId); // scopes read from config

 var options = new OidcClientOptions
 {
     Authority = this.config.p_Authority, // URL of identity server read from config
     ClientId = this.config.p_ClientId,
     RedirectUri = "http://localhost/VT_ConsoleCore",
     Flow = OidcClientOptions.AuthenticationFlow.Hybrid,
     ClientSecret= "secret",
     Browser = new WpfEmbeddedBrowser()
 };
 foreach (CScopeMasterBase scope in this.scopes)
 {
     options.Scope+= $"{scope.p_AddScopeFor} ";
 }


 _oidcClient = new OidcClient(options);