将 ASP.NET Identity 与多个微服务一起使用

时间:2021-02-05 20:04:13

标签: asp.net authorization asp.net-identity microservices

我一直在转移多个单体应用程序并将它们分解为少数微服务。我们已经身份服务器与多个提供商一起用于 SSO 目的,允许用户登录一次并访问每个应用程序。

但是,我正在寻找有关用户授权微服务指南。

我可以使用类似于 Startup.cs

中的以下代码轻松验证用户收到的声明
services
    .AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
    .AddIdentityServerAuthentication(options => {
        options.Authority = ssoSettings.BaseUri.ToString();
        options.ApiName = ssoSettings.ApiName;
        options.ApiSecret = ssoSettings.ClientSecret;

        options.EnableCaching = true;
    });

但是,当用户未登录时,如何跟踪声明之外或自动化流程需要的用户属性呢?显示名称、电子邮件地址或用于权限的特定于服务的角色。

对于微服务,我们被告知每个服务应该存储刚好所需的信息。这表明我需要某种“用户”和“角色”表来存储这些信息。每个服务可能需要特定于该特定服务的类似表。

问题 1:这是正确的方法吗?每个服务是否应该存储它需要的配置文件属性和服务特定角色,或者,因为有多个应用程序,所有这些都应该被推回一个“配置文件”服务,该服务具有集合中每个应用程序和服务的属性? (单个共享服务对我来说似乎很丑陋,听起来像是单点故障。)

问题 2ASP.NET Identity 是否是它所在位置的正确选择?

是的,该功能具有很强的可扩展性,可以轻松扩展以存储用户“个人资料”数据,例如姓名、地址等。但它还附带了大量功能,这些功能对于严格授权< /强>。密码、登录名、声明等不会存储在这些服务中。他们又回到了身份服务器上。如果不是最佳选择,是否有人可以推荐一个包而不必自己动手?

我遇到的另一个问题是处理第一次访问服务的用户。微服务上没有“登录”操作——只是带有需要验证的令牌的传入请求。该令牌要么与该服务存储中的用户匹配,要么需要创建用户记录。

我通过创建一个 CurrentUserProvider 来满足此要求,该 HttpContext 使用来自 IAsyncActionFilter 的声明并在商店中查找用户。如果用户不存在,则创建一个新用户。此服务封装在全局 =-MAX($B$1-MAX(A$1:A1)+MIN(A$1:A1),0) 中,以确保它针对每个传入请求运行。

不幸的是,如果同时收到多个请求,这会导致用户偶尔创建多次。我怀疑解决这个问题将涉及某种(1)互斥锁阻塞或(2)扩展商店验证检查的唯一性(例如,强制电子邮件是唯一的,这将防止第二条记录被写入)或(3)跨同一服务的多个实例共享缓存。但是,这种方法可能无法很好地扩展,并且需要使用存储 (SQL) 中的异常来指示“重复”,这很丑陋。

问题 3:这是最好的方法吗?有没有可以推荐的模式或包来处理这个问题?

0 个答案:

没有答案