我们正在aspnetboilerplate中实现基于IdentityServer的外部身份验证。到目前为止,一切顺利,外部身份验证成功,但未返回回调应用程序。它停留在IdentityServer登录页面中,但用户已登录,如下所示。
问题似乎在于设置TenantId。
在ExternalController
控制器的Callback
操作中,而不是AutoProvisionUser
用户中,我们正在将该用户插入数据库中。但是我们不确定如何设置TenantId
。
[HttpGet]
public async Task<IActionResult> Callback()
{
// read external identity from the temporary cookie
var result = await HttpContext.AuthenticateAsync(IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme);
if (result?.Succeeded != true)
{
throw new Exception("External authentication error");
}
//AbpClaimTypes.TenantId = "1";
CurrentUnitOfWork.SetTenantId(1);
// lookup our user and external provider info
var (user, provider, providerUserId, providerUserName, providerEmailId, claims) = await FindUserFromExternalProvider(result);
.
.
.
}
[我们尝试使用CurrentUnitOfWork.SetTenantId(1)
,但看起来TenantId
仅在此范围内保留,并且我在日志中看到以下错误
ng.AuthorizeInteractionResponseGenerator-显示登录名:用户不是有效
[在进一步调试并查看aspnetboilerplate的代码后,我们发现类tenantId
的方法IsActiveAsync
中的AbpProfileService.cs(行号41、42)为空,因此将引发上述错误。
当我对第42行的tenantId
进行硬编码时,重定向按预期方式工作。
所以,在aspboilerplate中使用外部认证时,如何设置tenantId
?
阅读本文可能会有用。 https://aspnetboilerplate.com/Pages/Documents/Zero/Identity-Server
Abp允许配置和使用IdentityServer4。这可能会帮助您实现目标。它还支持使用JWT令牌的外部身份验证,通过它可以保存有用的信息,例如租户ID等。