如何将 ui_locales 传递回请求的客户端?
How to pass ui_locales back to requested client?
如何在授权请求完成后将 ui_locales 从 IdentityServer 传递给客户端?
我在不同域下有多个应用程序 + Idsv4(我们无法共享 cookie)。示例:
- Mvc App1(主登陆网站)
- Mvc App2
- 身份服务器
- 用户转到 MvcApp1 并更改屏幕上的 UiLocales(例如 es-ES)。我在 cookies
中存储了 ui-Culture
- 然后他们点击登录,AuthorisedRequest 被发送到带有
ui_locales
(es-ES) 的 Idsv4。
- Idsv4 接收
ui_locales
并在登录屏幕上显示正确的翻译文本 (es-ES)。
- 用户输入用户凭证,成功并return到redirectUri
- App1 仍然可以显示正确的文本,因为它在 cookie 中存储了语言环境
- 当用户导航到 App2 并发生授权请求时,Idsv4 没有return正确的语言环境
- 所以,App2授权成功后总是显示英文文本
问题是我可以设法在主应用程序和 idsv4 之间传递语言环境信息,以在两个应用程序中显示正确的本地化文本。但是当用户导航到第二个应用程序时(我们有超过 5 个应用程序链接到 idsv4),它总是设置回英文文本。
请看下面的时序图:
正如您在上面看到的,由于 Idsv4 没有 return ui_locales
信息(即使它自己显示正确的翻译文本),第二个应用程序无法检测到哪种语言显示并回退到默认语言 - 英语。
我在 App1 的 Startup.cs 中传递了每个关注者的文化信息。但是 ctx.ProtocolMessage.UiLocales
在 OnAuthorizationCodeReceived
事件中始终为 null。
options.Events = new OpenIdConnectEvents
{
OnRedirectToIdentityProvider = ctx =>
{
ctx.ProtocolMessage.UiLocales = Thread.CurrentThread.CurrentUICulture.Name;
return Task.CompletedTask;
},
OnAuthorizationCodeReceived = ctx =>
{
Console.WriteLine("OnAuthorizationCodeReceived");
return Task.CompletedTask;
},
....
}
所以,我想知道在 Idsv4 中成功授权后是否可以嵌入 ui_locales
值。
或者 Idsv4 不这样做是因为它不是身份验证服务的责任?
是否必须在用户导航到其他应用程序时传递语言环境信息才能解决此问题?
示例:https://ttcgApp1.com/?ui=es-ES, https://MyApp2.net/?ui-es-ES
你能帮忙吗?
IdentityServer 不会将任何信息发送回客户端,因此最好的解决方案可能是添加一个声明,告知登录时使用的语言环境。
请注意,令牌确实包含有关登录过程的附加信息,例如使用的流量:"amr" = [ "pwd"]
.
可用于限制客户端访问的信息,例如需要 2FA。
由于 OnAuthorizationCodeReceived
仅在成功登录后调用,因此您可以在此处阅读声明并使用它根据 IdentityServer 中的用户区域设置相应地设置区域设置。
如何在授权请求完成后将 ui_locales 从 IdentityServer 传递给客户端?
我在不同域下有多个应用程序 + Idsv4(我们无法共享 cookie)。示例:
- Mvc App1(主登陆网站)
- Mvc App2
- 身份服务器
- 用户转到 MvcApp1 并更改屏幕上的 UiLocales(例如 es-ES)。我在 cookies 中存储了 ui-Culture
- 然后他们点击登录,AuthorisedRequest 被发送到带有
ui_locales
(es-ES) 的 Idsv4。 - Idsv4 接收
ui_locales
并在登录屏幕上显示正确的翻译文本 (es-ES)。 - 用户输入用户凭证,成功并return到redirectUri
- App1 仍然可以显示正确的文本,因为它在 cookie 中存储了语言环境
- 当用户导航到 App2 并发生授权请求时,Idsv4 没有return正确的语言环境
- 所以,App2授权成功后总是显示英文文本
问题是我可以设法在主应用程序和 idsv4 之间传递语言环境信息,以在两个应用程序中显示正确的本地化文本。但是当用户导航到第二个应用程序时(我们有超过 5 个应用程序链接到 idsv4),它总是设置回英文文本。
请看下面的时序图:
正如您在上面看到的,由于 Idsv4 没有 return ui_locales
信息(即使它自己显示正确的翻译文本),第二个应用程序无法检测到哪种语言显示并回退到默认语言 - 英语。
我在 App1 的 Startup.cs 中传递了每个关注者的文化信息。但是 ctx.ProtocolMessage.UiLocales
在 OnAuthorizationCodeReceived
事件中始终为 null。
options.Events = new OpenIdConnectEvents
{
OnRedirectToIdentityProvider = ctx =>
{
ctx.ProtocolMessage.UiLocales = Thread.CurrentThread.CurrentUICulture.Name;
return Task.CompletedTask;
},
OnAuthorizationCodeReceived = ctx =>
{
Console.WriteLine("OnAuthorizationCodeReceived");
return Task.CompletedTask;
},
....
}
所以,我想知道在 Idsv4 中成功授权后是否可以嵌入 ui_locales
值。
或者 Idsv4 不这样做是因为它不是身份验证服务的责任?
是否必须在用户导航到其他应用程序时传递语言环境信息才能解决此问题?
示例:https://ttcgApp1.com/?ui=es-ES, https://MyApp2.net/?ui-es-ES
你能帮忙吗?
IdentityServer 不会将任何信息发送回客户端,因此最好的解决方案可能是添加一个声明,告知登录时使用的语言环境。
请注意,令牌确实包含有关登录过程的附加信息,例如使用的流量:"amr" = [ "pwd"]
.
可用于限制客户端访问的信息,例如需要 2FA。
由于 OnAuthorizationCodeReceived
仅在成功登录后调用,因此您可以在此处阅读声明并使用它根据 IdentityServer 中的用户区域设置相应地设置区域设置。