如何在 Identity Server 4 控制器中访问 Client_id 的调用客户端

How to Access Client_id of Calling Client in Identity Server 4 Controller

我正在使用 Identity Server 4 对网站和 WPF 应用程序进行身份验证。在网站上,我希望用户能够在登录时选中“记住我”框,但我不希望 WPF 应用程序这样做。我有在前端禁用该复选框的逻辑,但在我的控制器中遇到了问题。我有这个功能

[HttpGet]
public async Task<IActionResult> Login(string returnUrl)
{
    LoginViewModel _vm;
    _vm = await BuildLoginViewModelAsync(returnUrl);
    //if(Client_id == "wpf") <- this is what I need help with
    //{
    //    _vm.AllowRememberMe = false;
    //}
    return View(_vm);  
} 

此控制器包含

private readonly IIdentityServerInteractionService mInteraction;
private readonly IClientStore mClientStore;
private readonly IAuthenticationSchemeProvider mSchemeProvider;
private readonly IEventService mEvents;

如有任何帮助,我们将不胜感激

我认为 client_id 不能直接从登录方法中的任何 IS4 构造中获得。但是,根据您的 OIDC 流程,您的 client_id 可能作为“returnUrl”参数的一部分传递。看看你的 return URL 看看它是否在那里。

例如,我有一个连接到 IS4 的水疗网站,显示 returnURL 的:

https://localhost:8080/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3DspaClient%26redirect_uri%3Dhttps...(long url continues)

您可以看到它包含值为“spaClient”的“client_id”参数。只需使用您选择的代码(例如 RegEx)解析 returnUrl 并从那里提取 client_id。我没有任何 WPF 经验,因此它的行为可能会有所不同并且不会传递此参数。

您可以使用您的代码片段从 IIdentityServerInteractionService 返回的 AuthorizationRequest 获取客户端 ID,如下所示:

var context = await mInteraction.GetAuthorizationContextAsync(returnUrl);
_vm.AllowedRememberMe = context.ClientId != "wpf";

但是,最好将此逻辑放在构造视图模型的 BuildLoginViewModelAsync 方法中,而不是在构造后设置 属性。