使用可用的应用程序创建一个应用程序表。
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]
那么。在自定义 ProfileService 中的 IsActiveAsync 方法中检查以查看哪些用户具有访问权限。我使用公司作为鉴别器,然后将 CompanyId 添加到我的 AspNetUser 表中,但您可以使用用户 ID 创建一个名为 [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 注册配置文件服务以及为服务注入依赖项。
但这应该会让你走上正轨。