簡體   English   中英

如何讓 Angular Client 通知 Identity Server 使用哪種登錄方法?

[英]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 個選項:

  1. 使用用戶名和密碼登錄
  2. 使用谷歌登錄
  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM