[英]How to make Angular Client to inform Identity Server which login method to use?
我將 IdentityServer 4 與使用OIDC Client JS的 Angular 10 客戶端一起使用:
要重定向用戶進行登錄,我在 Angular 的客戶端上調用 signinRedirect:
UserManager.signinRedirect(args)
重定向到 IdentityServer 4 AcccountController 的登錄操作:
[HttpGet]
public async Task<IActionResult> Login(string returnUrl) {
var vm = await BuildLoginViewModelAsync(returnUrl);
if (vm.IsExternalLoginOnly) {
// we only have one option for logging in and it's an external provider
return RedirectToAction("Challenge", "External", new { scheme = vm.ExternalLoginScheme, returnUrl });
}
return View(vm);
}
題
我在身份服務器中配置了 Google 和 Facebook 外部提供程序。
如何使用signinRedirect
並通知 IdentityServer 使用外部提供商(如 Google)進行登錄?
我想繞過 IdentityServer 中的登錄頁面,其中有 3 個選項:
所以 Angular 客戶端會通知 Identity Server 應該使用哪種登錄方法。
更新
經過一些研究,似乎規范中有一種方法可以指定用戶使用哪個提供程序:
UserManager.signinRedirect({ acr_values: 'IdP:Google' }));
然后在AccountController 的 BuildLoginViewModelAsync 上有以下內容:
var context = await _interactionService.GetAuthorizationContextAsync(returnUrl);
if (request?.IdP != null && await _schemeProvider.GetSchemeAsync(request.IdP) != null) {
var local = request.IdP == IdentityServer4.IdentityServerConstants.LocalIdentityProvider;
如果我沒有錯, IF
條件和以下代碼將檢查應使用哪個登錄提供程序:本地或配置的外部提供程序之一。
我調試了context
並得到以下信息:
解析了 AcrValues,但未定義屬性 IdP。
AcrValues 不應該是解決這個問題的方法嗎? 我錯過了什么?
通過使用signinRedirect
方法的args
參數, signinRedirect
使用 oidc-client 向身份提供者發送消息。
如果您從他們的 github 存儲庫中查看oidc-client-js/src/SigninRequest.js ,您會發現您可以為上述方法提供以下可選參數:
data
,prompt
,display
,max_age
,ui_locales
,id_token_hint
,login_hint
,acr_values
,resource
,response_mode
,request
,request_uri
,extraQueryParams
,request_type
,client_secret
,extraTokenParams
,skipUserInfo
在代碼的后面,在這個文件版本的第 75 行,他們有這個:
for(let key in extraQueryParams){
url = UrlUtility.addQueryParam(url, key, extraQueryParams[key])
}
這意味着它們允許開發人員使用extraQueryParams
來提供自定義參數。
現在假設您的自定義消息參數可能被稱為useExternalProvider
,您應該能夠像這樣調用signInRedirect
:
UserManager.signinRedirect({
extraQueryParams: {
useExternalProvider: "google"
}});
要在您的 IdentityServer 上訪問此參數,請找到調用GetAuthorizationContextAsync
的行並檢查協議消息參數,如下所示:
var context = await interaction.GetAuthorizationContextAsync(returnUrl);
var externalProviderToUse = context.Parameters.Get("useExternalProvider");
如果您使用他們的 QuickStart,它通常在BuildLoginViewModelAsync(string returnUrl)
方法中。
從那里您可以從數據庫中檢索外部登錄參數,或者從您保留這些參數的任何位置檢索外部登錄參數,而不是將用戶重定向到登錄頁面, ExternalLogin(string provider, string returnUrl)
使用RedirectToAction
將它們直接重定向到您的ExternalLogin(string provider, string returnUrl)
。
編輯
如果要為此使用acr_values
參數,並且稍后在 IdentityServer 授權上下文中要使用Idp
屬性,則可以調用:
// "idp:" is case sensitive
UserManager.signinRedirect({ acr_values: 'idp:Google' }));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.