Как использовать IdentityServer4 для аутентификации локального пользователя из локальной базы данных? - PullRequest
2 голосов
/ 24 сентября 2019

Я создаю единый вход для нескольких существующих проектов.Большинство приложений уже используют одну и ту же базу данных, поэтому одни и те же пользователи и я использую этих пользователей в IdentityServer.Но есть одно приложение, которое имеет собственную базу данных пользователей и экран входа в систему.Пользователи из этой таблицы используются в одной из таблиц в этом приложении (FK).

Моя идея состоит в том, чтобы оставить базу данных существующих пользователей как есть.Добавьте столбец MasterUserGuid в Users таблицу, которая будет содержать «главный» Guid пользователя (таким образом, пользователь, которого IdentityServer использует для аутентификации) и реализует следующий поток:

  1. Пользователь открывает приложение и не являетсявошедший в систему
  2. Пользователь перенаправлен на IdentityServer и использует глобальные учетные данные
  3. Пользователь перенаправлен обратно в приложение, которое получает глобальный идентификатор пользователя GUID из заявок и аутентифицирует локального пользователя (с этим GUID в MasterUserGuidстолбец) вместо использования глобального пользователя

Проблема заключается в том, что я не знаю, как реализовать шаг 3 или вообще возможно ли это / поддерживается в IdentityServer4.На данный момент я перенаправлен на IdentityServer, аутентифицирован и перенаправлен обратно, но затем приложение пытается использовать этого внешнего пользователя.

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

Возможен ли сценарий, описанный в приведенных мною шагах, и вменяемый?

1 Ответ

1 голос
/ 24 сентября 2019

Вам необходимо сначала настроить приложение для аутентификации через IdentityServer.Удалите всю логику ASP.NET Core Identity, связанную с регистрацией, входом в систему и т. Д., Предполагая, что все это будет сделано на стороне IdentityServer.Затем реализуйте экземпляр IClaimsTransformation, который либо заменит ваш текущий ClaimsPrincipal, либо добавит к нему дополнительные идентификаторы, если необходимо, с требуемыми значениями утверждений (заполняемыми из локальной базы данных).Вот пример:

public class MyClaimsTransformer : IClaimsTransformation
{
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var claims = new List<Claim>();
        claims.Add(new Claim(...)); // put here your claim type and value

        var identity = new ClaimsIdentity(claims);
        principal.AddIdentity(identity);
        return principal;
    }
}

Затем зарегистрируйте преобразователь утверждений в МОК в методе Startup.ConfigureServices:

services.AddTransient<IClaimsTransformation, MyClaimsTransformer>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...