Создайте таблицу приложений с помощью доступных приложений.
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, а также внедрение зависимости для службы.
Но это должно вывести вас на правильный путь.