【问题标题】:IdentityServer4 + ASP.NET Identity User ManagementIdentityServer4 + ASP.NET 身份用户管理
【发布时间】:2018-09-24 14:27:35
【问题描述】:

以下是正在开展的项目。

  • IdentityServer4(一个实例)
  • ASP.NET 身份(一个实例)
  • 多个独立客户端

采取什么方法来确保每个客户端的用户独立于该客户端?这意味着客户端 A 的用户应该无法登录客户端 B。

我想保留一个 IdentityServer4/ASP.NET Identity 实例。这是开箱即用的,还是我需要自定义?看起来如何?

感谢您对此的看法。

【问题讨论】:

    标签: asp.net-identity identityserver4


    【解决方案1】:

    使用可用的应用程序创建一个应用程序表。

    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 注册配置文件服务以及为服务注入依赖项。

    但这应该会让你走上正轨。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-30
      • 2016-07-25
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      相关资源
      最近更新 更多