Авторизация между компьютерами с IdentityServer4 - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть клиентская интеграция, и я хотел авторизацию между компьютерами между этим сервером и нашими серверами.Я предполагал, что мог бы использовать поток authorization_code, но, похоже, ему нужен cookie-файл пользователя, иначе он всегда перенаправляет на страницу входа.

Есть ли способ с помощью IdentityServer4, что сервер может запросить меня с некоторымипользовательская информация, например, может быть, зашифрованный идентификатор пользователя, и я могу использовать его для возврата кода авторизации?Я смог достичь этого с помощью собственной реализации AuthorizeInteractionResponseGenerator.Я переопределил метод ProcessLoginAsync() и ввел новый тип приглашения, скажем, abc, поэтому, когда предоставленный тип приглашения равен abc, я беру идентификаторы пользователя из необработанного запроса и регистрирую этого пользователя при создании ClaimsPrincipal до тех пор, покаконец Я получаю сообщение об ошибке:

InvalidOperationException: пользователь в настоящий момент не аутентифицирован

Представленная трассировка стека выглядит следующим образом:

System.InvalidOperationException: User is not currently authenticated
   at IdentityServer4.Services.DefaultUserSession.<SetClientListPropertyValueAsync>d__26.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Services.DefaultUserSession.<SetClientsAsync>d__25.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Services.DefaultUserSession.<AddClientIdAsync>d__22.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Endpoints.Results.AuthorizeResult.<ProcessResponseAsync>d__12.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Endpoints.Results.AuthorizeResult.<ExecuteAsync>d__10.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Hosting.IdentityServerMiddleware.<Invoke>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at IdentityServer4.Hosting.IdentityServerMiddleware.<Invoke>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.<Invoke>d__6.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.<Invoke>d__8.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Hosting.BaseUrlMiddleware.<Invoke>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.<Invoke>d__7.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Rp.Middleware.IdHashing.IdHashingMiddleware.<Invoke>d__7.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.<Invoke>d__7.MoveNext()

Это имеетэто должно быть сделано из-за требования, здесь нет споров, но я хотел бы, чтобы ваша помощь заключалась в том, как я могу устранить вышеупомянутую ошибку?Кроме того, я делаю слишком много переделок, в то время как я мог бы использовать IdentityServer4 каким-либо другим способом для достижения этой цели?

С нетерпением ждем вашего ответа.Спасибо!

Обновление:

Поэтому, чтобы дать всем немного больше контекста, я не пытаюсь сделать единый вход.Что я делаю, так это то, что я создаю приложение для клиента, который не хочет, чтобы пользователи знали, что приложение не от них.Таким образом, пользователь входит на веб-сайт клиента, но на одной из страниц загружается приложение Angular.Теперь это приложение не зависит от клиента, оно имеет все, что ему нужно в нашей БД, все, что ему нужно от клиента, - это то, что нам нужно передать, чтобы мы могли также войти в систему с клиентским пользователем в нашем приложении, но без какого-либо согласия иличто-нибудь, чтобы создать ощущение, что наше приложение на самом деле является частью клиентского приложения.И мы не можем полностью полагаться на аутентификацию клиента, потому что у меня несколько клиентов, и все делают аутентификацию по-разному.

1 Ответ

0 голосов
/ 02 февраля 2019

Поток, который предпочтителен для связи между машинами, называется client credentials.Сказав это, похоже, вам нужен пользовательский контекст в сценарии взаимодействия между компьютерами, чтобы вы также могли технически использовать поток resource owner credentials.Для этого вам необходимо внедрить IResourceOwnerPasswordValidator на стороне сервера идентификации 4.

Прежде чем приступать к любой из этих реализаций, пожалуйста, убедитесь, что вы понимаете проблемы безопасности при использовании потока resource owner credentials какэто обычно осуждается и не рекомендуется.Также кажется, что вы ищете пользовательский контекст, который будет присутствовать в сценарии взаимодействия вашего компьютера с компьютером, чтобы он уже выглядел как красный флаг в дизайне.

Если вам нужна дополнительная информация, вы можете обратиться к превосходномупримеры быстрого запуска для сервера 4 идентификации, где вы можете проверить, как могут быть реализованы оба вышеупомянутых потока.

Identity Server 4 образца

...