如何从微服务实现 SAML 单点注销请求

How to Implement SAML Single Logout request from a microservice

我已经在我的应用程序中实施了多租户 SAML SSO。我在 AngularJS 中使用带有 UI 的单页应用程序,Web API(用于断言 URL),以及用于创建和处理 SAML 请求的微服务。我在我的微服务中使用 Itfoxtech 库。

我已成功实施 SAML SSO 登录,并且运行良好。但是,我在实施 SAML 单点注销时遇到了问题。在 SAML 断言上,我只是提取了一些声明并将它们返回到 Web API。注销时,我似乎需要 ClaimsIdentity 和 HttpContext。我在 SAML 断言期间保留了 ClaimsIdentity,并在注销期间重新使用它,但我无权访问 HttpContext。我从 DefaultHttpContext 创建了一个自定义的 httpContext 并尝试执行以下代码行,

var saml2LogoutRequest = await new Saml2LogoutRequest(config, User).DeleteSession(HttpContext);

但是报错,

No sign-out authentication handlers are registered. Did you forget to call AddAuthentication().AddCookies

我的问题是如何在不使用 HttpContext 的情况下执行单次注销,或者如果需要,那么如何手动创建它?

注销SAML 2.0 需要NameID、NameID 格式和会话索引。要实现这一点,您可以使用声明填充 ClaimsIdentity:Saml2ClaimTypes.NameIdSaml2ClaimTypes.NameIdFormatSaml2ClaimTypes.SessionIndex.

在单点注销的情况下,您只需要验证请求:

Saml2StatusCodes status;
var requestBinding = new Saml2PostBinding();
var logoutRequest = new Saml2LogoutRequest(config, User);
try
{
    requestBinding.Unbind(Request.ToGenericHttpRequest(), logoutRequest);
    status = Saml2StatusCodes.Success;
    //TODO handle logout
}
catch (Exception exc)
{
    // log exception
    Debug.WriteLine("SingleLogout error: " + exc.ToString());
    status = Saml2StatusCodes.RequestDenied;
}

并回复:

var responsebinding = new Saml2PostBinding();
responsebinding.RelayState = requestBinding.RelayState;
var saml2LogoutResponse = new Saml2LogoutResponse(config)
{
    InResponseToAsString = logoutRequest.IdAsString,
    Status = status,
};
return responsebinding.Bind(saml2LogoutResponse).ToActionResult();

您不需要调用 DeleteSession(HttpContext) 但您需要以某种方式处理注销。