1

我已经在我的应用程序中实现了多租户 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 的情况下执行单次注销,或者如果需要,那么如何手动创建它?

4

1 回答 1

1

注销 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)但您需要以某种方式处理注销。

于 2021-04-13T12:44:52.487 回答