IdentityServer4 + ASP.NET Identity User Management - PullRequest
0 голосов
/ 24 сентября 2018

Здесь представлены проекты.

  • IdentityServer4 (один экземпляр)
  • ASP.NET Identity (один экземпляр)
  • Несколько независимых клиентов

Каков подход к обеспечению того, чтобы пользователи каждого клиента были независимы от этого клиента?Это означает, что пользователь клиента A не должен иметь возможность войти в систему на клиенте B.

Я хотел бы сохранить один экземпляр IdentityServer4 / ASP.NET Identity.Это встроенный из коробки или мне нужно настроить и как это будет выглядеть?

Буду признателен за ваши мысли по этому поводу.

1 Ответ

0 голосов
/ 19 июня 2019

Создайте таблицу приложений с помощью доступных приложений.

CREATE TABLE [dbo].[Application](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Description] [nvarchar](128) NOT NULL
 CONSTRAINT [PK_Application] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Затем.в вашем методе IsActiveAsync в пользовательской проверке ProfileService, чтобы увидеть, какие пользователи имеют доступ.Я использовал компании в качестве дискриминатора, а затем добавил CompanyId в мою таблицу AspNetUser, но вы можете создать таблицу под названием [UserApplication] с идентификаторами пользователей, чтобы сделать то же самое.

CREATE TABLE [dbo].[CompanyApplication](
    [CompanyId] [int] NOT NULL,
    [ApplicationId] [int] NOT NULL,
 CONSTRAINT [PK_CompanyApplication] PRIMARY KEY CLUSTERED 
(
    [CompanyId] ASC,
    [ApplicationId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Создать службу пользовательского профиля дляпозаботьтесь о фильтрации.

// Custom profile service
public class CustomService : IProfileService
{
    ...

    public async Task IsActiveAsync(IsActiveContext context)
    {
        var userClaim = context.Subject.Claims.FirstOrDefault(x => x.Type == "sub");

        if (userClaim != null)
        {
            var user = await _userManager.FindByIdAsync(userClaim.Value);
            if (user != null)
            {
                var applications = FindCompanyApplications(user);
                context.IsActive = applications.Any(s => s == context.Client.ClientId);
            }
            else
                context.IsActive = false;
        }

    }
    private List<String> FindCompanyApplications(SpUser user)
    {
        return (
            // I named this CompanyApplicationRefs 
            // but comes from CompanyApplication table
            from ca in db.CompanyApplicationRefs 
            join a in db.Applications on ca.ApplicationId equals a.Id
            where ca.CompanyId == user.CompanyId
            select a.Description
        ).ToList();
    }
} 

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

Но это должно вывести вас на правильный путь.

...