Почему я вижу "недопустимый клиент" в журналах IdentityServer4 при использовании внешнего входа в учетную запись Microsoft?
У меня есть реализация IdentityServer4, которая имеет внутреннее промежуточное ПО OIDC OpenIdConnect по умолчанию для обеспечения доступа к локальным API-интерфейсам и поддержки внешних поставщиков входа в систему, начиная с Microsoft. Я реализовал пользовательское хранилище IClientStore и подключил его к промежуточному программному обеспечению с помощью
.AddClientStore<IS4ClientStore>();
Когда внутренние аутентификаторы неявного соединения OIDC, IS4ClientStore.FindClientByIdAsync вызывается BuildLoginViewModelAsync, как в примере с
_clientStore.FindEnabledClientByIdAsync(context.ClientId);
который возвращает ожидаемый IdentityServer4.Client и все аутентифицируется и т. д.
Когда я звоню внешнему провайдеру (Microsoft OAuth), он проходит через процесс аутентификации, подключаясь к моему прилагаемому идентификатору приложения, проходит через процесс утверждений Microsoft, а затем Microsoft перенаправляет обратно на https://localhost:5001/signin-microsoft.
Промежуточное программное обеспечение ядра asp.net из вызывающих сервисов.AddAuthentication().AddMicrosoftAccount(параметры) при запуске не использует мое клиентское хранилище для поиска идентификатора клиента, оно просто сообщает об ошибке:
Request starting HTTP/1.1 GET https://localhost:5001/signin-microsoft?code=M91ae2ef1-701d-ceb4-d479-a905d3d02a4d&state=CfDJ8GGNLFmYOI9KouhmbB3NzeJ5omhARPg-YVCPW7u1aCyhnGfOx9_Nj4VL8cMIxmO48nk_8UkfB9Pv7Q7tzZZb8nsq5y26giY9fXuVyRsn5qx8a1nSX8tKFWk1uo9ongL5V0MXY6sgU6eNUEzsxgyNFz_20QLVU20y9G7jRpmxoOcpQ1s1SJx0Tu2BBlRrI840-D-jUmg1ix7xDUfmXF_rPVp6e88rzIuCfbQO4otNq2fAsm4
info: Microsoft.AspNetCore.Authentication.MicrosoftAccount.MicrosoftAccountHandler[4]
Error from RemoteAuthentication: OAuth token endpoint failure: Status: BadRequest;Headers: Cache-Control: no-cache, no-store
Pragma: no-cache
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
x-ms-request-id: 759b3046-cbad-489d-98c1-6e83bb390b00
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"
Set-Cookie: fpc=AZFdz4kBW-ZHi5twlc6DCrARHQUSAQDQZKAdWIfWCA; expires=Sat, 02-Mar-2019 08:43:04 GMT; path=/; secure; HttpOnly, x-ms-gateway-slice=prod; path=/; secure; HttpOnly, stsservicecookie=ests; path=/; secure; HttpOnly
Date: Thu, 31 Jan 2019 08:43:04 GMT
;Body: {"error":"unauthorized_client","error_description":"AADSTS700016: Application with identifier '000000005D256100' was not found in the directory '9188040d-6c67-4c5b-b112-36a304b66dad'. This can happen if the application has not been installed by the administrator of the tenant or consented to by any user in the tenant. You may have sent your authentication request to the wrong tenant\r\nTrace ID: 759b3046-cbad-489d-98c1-6e83bb390b00\r\nCorrelation ID: 858c340d-7c0c-4fa9-86c2-f8417e5915f1\r\nTimestamp: 2019-01-31 08:43:04Z","error_codes":[700016],"timestamp":"2019-01-31 08:43:04Z","trace_id":"759b3046-cbad-489d-98c1-6e83bb390b00","correlation_id":"858c340d-7c0c-4fa9-86c2-f8417e5915f1"};.
fail: Microsoft.AspNetCore.Server.Kestrel[13]
Connection id "0HLK7ARJEPT98", Request id "0HLK7DAJEPT98:00000005": An unhandled exception was thrown by the application.
System.Exception: An error was encountered while handling the remote login. ---> System.Exception: OAuth token endpoint failure: Status: BadRequest;Headers: Cache-Control: no-cache, no-store
Pragma: no-cache
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
x-ms-request-id: 759b3046-cbad-489d-98c1-6e83bb390b00
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"
Set-Cookie: fpc=AZFdz4kBW-ZHi5twlc6DCrARHQUSAQDQZKAdWIfWCA; expires=Sat, 02-Mar-2019 08:43:04 GMT; path=/; secure; HttpOnly, x-ms-gateway-slice=prod; path=/; secure; HttpOnly, stsservicecookie=ests; path=/; secure; HttpOnly
Date: Thu, 31 Jan 2019 08:43:04 GMT
;Body: {"error":"unauthorized_client","error_description":"AADSTS700016: Application with identifier '000000005D256100' was not found in the directory '9188040d-6c67-4c5b-b112-36a304b66dad'. This can happen if the application has not been installed by the administrator of the tenant or consented to by any user in the tenant. You may have sent your authentication request to the wrong tenant\r\nTrace ID: 759b3046-cbad-489d-98c1-6e83bb390b00\r\nCorrelation ID: 858c340d-7c0c-4fa9-86c2-f8417e5915f1\r\nTimestamp: 2019-01-31 08:43:04Z","error_codes":[700016],"timestamp":"2019-01-31 08:43:04Z","trace_id":"759b3046-cbad-489d-98c1-6e83bb390b00","correlation_id":"858c340d-7c0c-4fa9-86c2-f8417e5915f1"};
--- End of inner exception stack trace ---
at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.HandleRequestAsync()
at IdentityServer4.Hosting.FederatedSignOut.AuthenticationRequestHandlerWrapper.HandleRequestAsync() in C:\local\identity\server4\IdentityServer4\src\Hosting\FederatedSignOut\AuthenticationRequestHandlerWrapper.cs:line 38
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at IdentityServer4.Hosting.BaseUrlMiddleware.Invoke(HttpContext context) in C:\local\identity\server4\IdentityServer4\src\Hosting\BaseUrlMiddleware.cs:line 36
at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Request finished in 476.3734ms 500
Должен ли я использовать реализацию AddMicrosoftAccount из IdentityServer4?
1 ответ
Спасибо Jim & Mackie, чтобы указать мне правильное направление (я думал, что это из-за проблемы реализации пользовательского магазина на моей стороне)
Когда я проверял, у меня была правильная клиентская информация и секрет на странице https://apps.dev.microsoft.com/, я заметил ссылку для перехода на портал Azure для управления моими приложениями. ( https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/applicationsListBlade) Когда я перешел по этой ссылке, предыдущие приложения, которые я не показывал, поэтому я просто создал новое приложение и получил новый ApplicationId (который был теперь проводник, а не через портал) и секрет, подключили его к вызову.AddMicrosoftAccount, и я смог пройти через процесс аутентификации через вход в Microsoft и получить токен для завершения аутентификации на моем сервере.
Я предполагаю, что некоторый процент приложений, которые были добавлены через сайт apps.dev.microsoft.com, не находятся в резервном хранилище Microsoft после завершения процесса аутентификации, приложения могут находиться в запросе переднего плана и позволяют страницам аутентификации найдите ваше приложение и предоставьте страницу согласия, но затем при выдаче токена сторона Microsoft ищет другое хранилище и не находит приложение по ApplicationId, указанному на странице apps.dev.microsoft.com. Поэтому решение, по крайней мере в моем случае, состояло в том, чтобы вместо этого создать приложение на портале Azure.