1. 程式人生 > >第44章 添加新協議 - Identity Server 4 中文文檔(v1.0.0)

第44章 添加新協議 - Identity Server 4 中文文檔(v1.0.0)

iges author 重用 sign tsig dds mode 上下文 bool

除了對OpenID Connect和OAuth 2.0的內置支持之外,IdentityServer4還允許添加對其他協議的支持。

您可以將這些附加協議端點添加為中間件或使用例如MVC控制器。在這兩種情況下,您都可以訪問ASP.NET Core DI系統,該系統允許重用我們的內部服務,例如訪問客戶端定義或密鑰材料。

可以在此處找到添加WS-Federation支持的示例。

44.1 典型認證工作流程

身份驗證請求通常如下所示:

  • 身份驗證請求到達協議端點
  • 協議端點執行輸入驗證
  • 重定向到登錄頁面,返回URL設置回協議端點(如果用戶是匿名的)
    • 通過訪問當前請求詳細信息 IIdentityServerInteractionService
    • 用戶身份驗證(本地或通過外部身份驗證中間件)
    • 登錄用戶
    • 重定向回協議端點
  • 創建協議響應(令牌創建和重定向回客戶端)

44.2 用IdentityServer服務

要實現上述工作流程,需要與IdentityServer建立一些交互點。

44.2.1 訪問配置並重定向到登錄頁面

您可以通過將IdentityServerOptions類註入代碼來訪問IdentityServer配置。這個,例如具有登錄頁面的配置路徑:

var returnUrl = Url.Action("Index");
returnUrl = returnUrl.AddQueryString(Request.QueryString.Value);

var loginUrl = _options.UserInteraction.LoginUrl;
var url = loginUrl.AddQueryString(_options.UserInteraction.LoginReturnUrlParameter, returnUrl);

return Redirect(url);

44.2.2登錄頁面與當前協議請求之間的交互

所述IIdentityServerInteractionService支撐件轉動一個協議返回URL成解析和驗證上下文對象:

var context = await _interaction.GetAuthorizationContextAsync(returnUrl);

默認情況下,交互服務僅了解OpenID Connect協議消息。要擴展支持,您可以自己編寫IReturnUrlParser

public interface IReturnUrlParser
{
    bool IsValidReturnUrl(string returnUrl);
    Task<AuthorizationRequest> ParseAsync(string returnUrl);
}

..然後在DI中註冊解析器:

builder.Services.AddTransient<IReturnUrlParser, WsFederationReturnUrlParser>();

這允許登錄頁面獲取客戶端配置和其他協議參數等信息。

44.2.3 訪問用於創建協議響應的配置和密鑰材料

通過將IKeyMaterialService代碼註入到代碼中,您可以訪問配置的簽名憑據和驗證密鑰:

var credential = await _keys.GetSigningCredentialsAsync();
var key = credential.Key as Microsoft.IdentityModel.Tokens.X509SecurityKey;

var descriptor = new SecurityTokenDescriptor
{
    AppliesToAddress = result.Client.ClientId,
    Lifetime = new Lifetime(DateTime.UtcNow, DateTime.UtcNow.AddSeconds(result.Client.IdentityTokenLifetime)),
    ReplyToAddress = result.Client.RedirectUris.First(),
    SigningCredentials = new X509SigningCredentials(key.Certificate, result.RelyingParty.SignatureAlgorithm, result.RelyingParty.DigestAlgorithm),
    Subject = outgoingSubject,
    TokenIssuerName = _contextAccessor.HttpContext.GetIdentityServerIssuerUri(),
    TokenType = result.RelyingParty.TokenType
};

github地址

第44章 添加新協議 - Identity Server 4 中文文檔(v1.0.0)