我想在身份驗證質詢期間向 Identity Server 4 發送一個 acr 值,并id_token在登錄后將其回傳到重定向回傳的內部。
從我在網上閱讀的內容來看,我的印象是這是使用 acr 值的常用方法。
這個 acr 值與 IS4 沒有什么特殊關系,只需將其回傳,因此我可以使用身份驗證提供程式在站點上使用它。
context.ProtocolMessage.AcrValues我確實通過在回呼呼叫期間設定成功發送它RedirectToIdentityProvider,并且 IS4 確實得到了它,但是我沒有在id_token.
我是否需要做一些特別的事情才能將 acr 包含在id_token? 我應該以某種方式手動添加它嗎?任何代碼示例將不勝感激。
uj5u.com熱心網友回復:
我想說,您的印象太樂觀了 :)
迄今為止,對于特定 IdP 的實施來說,這是相當實驗性的和可選的。根據規范:此引數將acr宣告請求為自愿宣告。
Identityserver 所做的是acr_values引數決議和有限處理。
根據他們的檔案:
允許傳入額外的身份驗證相關資訊
IdentityServer 特殊情況下,以下專有資訊acr_values:
idp:name_of_idp繞過登錄/主域螢屏并將用戶直接轉發到選定的身份提供者(如果每個客戶端配置允許)
tenant:name_of_tenant可用于傳遞登錄 UI 的租戶名稱
您可以通過以下方式發送任意數量的空格分隔值:
&acr_values=param1:value1 param2:value2 tenant:name_of_tenant idp:name_of_idp
然后使用以下訪問器在 Identityserver 端執行任何自定義處理:
var ctx = _IIdentityServerInteractionService.GetAuthorizationContextAsync(returnUrl);
IEnumerable<string> acrs = ctx.AcrValues;
string tenant = ctx.Tenant;
string idp = ctx.IdP;
當您想通知客戶端他們acr_values已被處理時,您可以acr像任何其他用戶宣告一樣添加:
呼叫時首先將其添加到 Identityserver 中的會話中
await HttpContext.SignInAsync(identityServerUser, props);
// Where identityServerUser can take additional claims.
之后,您的自定義宣告位于Subject.
添加它的一種方法id_token是實作這里IProfileService描述的。
public Task GetProfileDataAsync(ProfileDataRequestContext context)
{
context.AddRequestedClaims(context.Subject.Claims);
if (context.Caller == "ClaimsProviderIdentityToken")
{
var acr = context.Subject.Claims.FirstOrDefault(c=>c.Type=="acr");
if(acr != null)
context.IssuedClaims.Add(acr);
}
return Task.CompletedTask;
}
另一種方法是在啟動時將宣告添加到方法中的IdentityResources.OpenId范圍GetIdentityResources()。是唯一的強制范圍,因此宣告將使用默認實作openid跳轉到令牌中。AddRequestedClaims()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/427971.html
