IdentityServer4 + Asp.Net Core Identity - сопоставление идентификаторов с пользователем базы данных приложения

Я пытаюсь реализовать IdentityServer4 с помощью Asp.Net Core Identity. Я хочу использовать IdentityServer4 в качестве централизованной точки аутентификации / авторизации для API, всегда использующих один и тот же идентификатор. Итак, идея состоит в том, чтобы хранить данные Asp.Net Core Identity в базе данных SQL, которая служит хранилищем идентификаторов.

Теперь вопрос в том, как сопоставить централизованную идентификацию с данными приложения. Я хочу использовать одного и того же пользователя идентификации в нескольких приложениях, но в каждом приложении у пользователя есть другие связанные сущности, роли и т. Д.

Я прочитал документацию по IdentityServer4, но не смог найти ничего, связанного с предлагаемой структурой.

Как я понял, вы каким-то образом сопоставляете идентификатор личности с вашим локальным пользователем приложения. Основные данные, такие как имя и т. Д., Хранятся в централизованном хранилище идентификационных данных, а данные, относящиеся к конкретному приложению, хранятся в базе данных конкретного приложения. Значит, вы бы не сохранили имя и т. Д. В базе данных конкретного приложения, верно? В каждом запросе, где вам нужны пользовательские данные, будет запрашивать сервер идентификации для получения информации / утверждений? А как насчет процесса регистрации?

Есть ли у кого-нибудь четкая структура структуры, которую можно использовать для понимания всей установки? (Разделение, например, Asp.Net Identity Provider, IdentityServer4, Protected Api.)


person Jazjef    schedule 04.09.2017    source источник


Ответы (3)


Значит, вы бы не сохранили имя и т. Д. В базе данных конкретного приложения, верно?

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

В каждом запросе, где вам нужны пользовательские данные, будет запрашивать сервер идентификации для получения информации / утверждений?

Не обязательно. Данные пользователя могут быть включены в токен удостоверения как утверждения. Затем утверждения будут сохранены в файле cookie в качестве билета проверки подлинности. Для каждого запроса эти утверждения (хранящиеся в файлах cookie) доступны через свойство User контроллера.

var identity = (ClaimsIdentity)User.Identity;
IEnumerable<Claim> claims = identity.Claims;

Вы можете хранить и запрашивать пользовательские данные, относящиеся к приложению, которые хранятся с идентификатором пользователя (в качестве идентификатора пользователя может использоваться утверждение sub).

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

А как насчет процесса регистрации?

Регистрация - это совершенно отдельный рабочий процесс, который не связан с сервером идентификации. Вам просто нужно сохранить пользователя в хранилище идентификаторов (возможно, с использованием идентификатора asp.net). Конечно, вы можете разместить контроллеры регистрации вместе с сервером идентификации, чтобы все, что связано с идентификацией, физически находилось на одном сервере. Вы также можете просто написать в хранилище пользователей IdentityServer из любого места, где вы размещаете процесс регистрации (например, из отдельного пользовательского интерфейса администратора или из рабочего процесса, включающего проверку электронной почты, ручное утверждение и т. Д.)

person rawel    schedule 25.01.2019
comment
Спасибо за объяснение! - person Jazjef; 19.09.2019

Чтобы настроить то, что вы храните в Asp.net Core Identity, вам необходимо использовать services.AddIdentity<ApplicationUser, ApplicationRole>. ApplicationUser и ApplicationRole расширяют IdentityUser и IdentityRole. Таким образом, вы можете заставить его хранить любую дополнительную информацию, которую хотите.

Затем, чтобы вернуть дополнительную информацию, вам нужно создать ProfileService, который реализует IProfileService. С помощью этой услуги вы можете добавить любую дополнительную информацию для получения токенов.

Вам необходимо зарегистрировать эту услугу как

services.AddSingleton<IProfileService, ProfileService>();
builder.AddAspNetIdentity<ApplicationUser>().AddProfileService<ProfileService>();

Вы можете зарегистрировать пользователя с дополнительной информацией, как показано ниже:

var user = new ApplicationUser
            {
                UserName = Username,
                Email = email,
                ExtraInfo1 = "Hello",
                ExtraInfo2 = "World"
            };
await _userManager.CreateAsync(user, "SomePassword");
person Ahmet    schedule 24.01.2019
comment
Считаете ли вы, что смешивание специфических для приложения и идентификационных данных - это хорошая идея? - person Monsignor; 25.01.2019
comment
Все зависит от сложности. Лично я просто добавляю столбец с внешним ключом. И с этим внешним ключом я могу просто запросить все остальные таблицы по мере необходимости. Например, вы можете добавить столбец с именем MemberId в свой ApplicationUser, и он может ссылаться на вашу таблицу Members. И оттуда вы можете создать всю сложную структуру таблиц, которая нужна вашему приложению. - person Ahmet; 25.01.2019

С OpenId у вас есть набор утверждений по умолчанию, связанных с пользователем. Таким образом, любое клиентское приложение может получить доступ к этим утверждениям. Убедитесь, что каждому клиенту назначены области действия openid и профиль. В противном случае клиентское приложение не сможет получить доступ к основным сведениям о пользователе.

В приложении Asp.Net Core вы можете получить доступ к этим утверждениям в контроллере с помощью свойства User.

person Ahamed Ishak    schedule 25.01.2019