asp.net-core - 使用 ITfoxtec.Identity.Saml2 启动的 SAML 2.0 注销 SP
问题描述
前提:我对使用 SAML2.0 和库 ITfoxtec.Identity.Saml2 还是很陌生。在我的场景中,我在 asp.net core 中实现了一个 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 Form does not contain SAMLRequest”
问题是我找不到在 IDP 上配置 LoggedOut 端点的方法。
我的问题是:从我的网络应用程序中启动注销的方式是否有问题?或者是否有一种方法可以从代码中在请求中设置 IDP 必须给我打电话的端点(注销)?或者在这种情况下,我的 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
}
推荐阅读
- scheduled-tasks - Chrome 73 在后台计划任务中停止支持无头模式?
- mysql - 从另一个表`title`中引用`title`
- java - 在控制台上绘制一棵圣诞树,使用 java.util.Scanner 输入大小,询问空格的位置
- mysql - 在 ConnectionFactory.php 第 274 行:找不到类“Illuminate\Database\MySqlConnection”
- javascript - 在它影响的内容下定位一个 js 按钮
- android - 使用 onClick 侦听器在 Firebase Null 中搜索
- excel - 将表单范围更改为列 (a,b,c,d)
- pandas - 是否可以在 Pandas 中不创建第三个数据框的情况下执行合并(vlookup)?
- docker - how to connect two docker container with host UDP port
- c - When are shared library functions loaded into the heap?