如何从微服务实现 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.NameId
、Saml2ClaimTypes.NameIdFormat
和 Saml2ClaimTypes.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)
但您需要以某种方式处理注销。
我已经在我的应用程序中实施了多租户 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.NameId
、Saml2ClaimTypes.NameIdFormat
和 Saml2ClaimTypes.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)
但您需要以某种方式处理注销。