使用 ITfoxtec.Identity.Saml2 发起的 SAML 2.0 注销 SP
SAML 2.0 Logout SP initiated using ITfoxtec.Identity.Saml2
前提:我对使用 SAML2.0 和库还很陌生
ITfoxtec.Identity.Saml2.
在我的场景中,我已经在 asp.net 核心中实现了一个 Web 应用程序,基本上基于库中包含的示例作为 TestWebAppCore。作为 IDP,我使用过 Keyloack 和 Okta。
我登录没有问题。我的问题随着注销而增加。
当 IDP 启动注销时我没有问题:我已经在 IDP 上配置了单点注销的端点(SingleLogout web Api)并且一切正常
我的问题是我的网络应用程序何时启动注销。工作流程如下:
在我页面的某处有一个注销按钮,它调用注销 Web-Api
[HttpPost("Logout")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout()
{
if (!User.Identity.IsAuthenticated)
{
return Redirect(Url.Content("~/"));
}
var binding = new Saml2PostBinding();
var saml2LogoutRequest = await new Saml2LogoutRequest(config, User).DeleteSession(HttpContext);
return binding.Bind(saml2LogoutRequest).ToActionResult();
}
不过好像不是这里的问题。
问题是 IDP 总是调用 SingleLogOut Web API。我认为在这种情况下这是不正确的:在这种情况下 IDP 必须调用 LoggedOut Web API
[Route("LoggedOut")]
public IActionResult LoggedOut()
{
var binding = new Saml2PostBinding();
binding.Unbind(Request.ToGenericHttpRequest(), new Saml2LogoutResponse(config));
return Redirect(Url.Content("~/"));
}
当然在这种情况下会引发以下异常“HTTP 表单不包含 SAMLRequest”
问题是我找不到在 IDP 上配置 LoggedOut 端点的方法。
我的问题是:我从 Web 应用程序启动注销的方式是否有问题?或者有没有一种方法可以从代码中设置 IDP 必须给我打电话的端点 (Loggedout)?或者在这种情况下我的 IDP 配置肯定有问题有人知道我可以用于测试的其他 IDP?
问题可能是您的 IdP 不支持两个注销端点,即:Location
和 ResponseLocation
。
您可以在您的应用程序(依赖方)中支持一个注销端点 (Location
),方法是读取请求以判断它是 SAML 2.0 请求还是 SAML 2.0 响应。
阅读代码看起来像这样:
var genericHttpRequest = Request.ToGenericHttpRequest();
if (new Saml2PostBinding().IsResponse(genericHttpRequest) || new Saml2RedirectBinding().IsResponse(genericHttpRequest))
{
// Do logged out.
}
else
{
// Do single logout
}
前提:我对使用 SAML2.0 和库还很陌生 ITfoxtec.Identity.Saml2. 在我的场景中,我已经在 asp.net 核心中实现了一个 Web 应用程序,基本上基于库中包含的示例作为 TestWebAppCore。作为 IDP,我使用过 Keyloack 和 Okta。 我登录没有问题。我的问题随着注销而增加。 当 IDP 启动注销时我没有问题:我已经在 IDP 上配置了单点注销的端点(SingleLogout web Api)并且一切正常 我的问题是我的网络应用程序何时启动注销。工作流程如下: 在我页面的某处有一个注销按钮,它调用注销 Web-Api
[HttpPost("Logout")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout()
{
if (!User.Identity.IsAuthenticated)
{
return Redirect(Url.Content("~/"));
}
var binding = new Saml2PostBinding();
var saml2LogoutRequest = await new Saml2LogoutRequest(config, User).DeleteSession(HttpContext);
return binding.Bind(saml2LogoutRequest).ToActionResult();
}
不过好像不是这里的问题。 问题是 IDP 总是调用 SingleLogOut Web API。我认为在这种情况下这是不正确的:在这种情况下 IDP 必须调用 LoggedOut Web API
[Route("LoggedOut")]
public IActionResult LoggedOut()
{
var binding = new Saml2PostBinding();
binding.Unbind(Request.ToGenericHttpRequest(), new Saml2LogoutResponse(config));
return Redirect(Url.Content("~/"));
}
当然在这种情况下会引发以下异常“HTTP 表单不包含 SAMLRequest”
问题是我找不到在 IDP 上配置 LoggedOut 端点的方法。
我的问题是:我从 Web 应用程序启动注销的方式是否有问题?或者有没有一种方法可以从代码中设置 IDP 必须给我打电话的端点 (Loggedout)?或者在这种情况下我的 IDP 配置肯定有问题有人知道我可以用于测试的其他 IDP?
问题可能是您的 IdP 不支持两个注销端点,即:Location
和 ResponseLocation
。
您可以在您的应用程序(依赖方)中支持一个注销端点 (Location
),方法是读取请求以判断它是 SAML 2.0 请求还是 SAML 2.0 响应。
阅读代码看起来像这样:
var genericHttpRequest = Request.ToGenericHttpRequest();
if (new Saml2PostBinding().IsResponse(genericHttpRequest) || new Saml2RedirectBinding().IsResponse(genericHttpRequest))
{
// Do logged out.
}
else
{
// Do single logout
}