如何使用 http-redirect 实现单点注销

How to implement single logout using http-redirect

我正在使用库 ITfoxtec Identity SAML 2.0 通过 ASP.Net 4.6 MVC 应用程序和仅支持 http-redirect 单点注销的第 3 方 IdP 来实施 SAML 2.0。我可以登录,但无法使用单点注销。该示例仅使用 http-post 进行注销。是否有任何公开可用的示例代码显示如何使用 http-redirect?

实现单一注销

提前感谢您的帮助!

通过将绑定 class Saml2PostBinding 更改为 Saml2RedirectBinding,只需稍作改动即可支持使用重定向绑定注销。以下内容基于ITfoxtec Identity SAML 2.0 documentation.

Auth 控制器中的注销方法

[HttpPost("Logout")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout()
{
    if (!User.Identity.IsAuthenticated)
    {
        return Redirect(Url.Content("~/"));
    }

    var binding = new Saml2RedirectBinding();
    var saml2LogoutRequest = await new Saml2LogoutRequest(config, User).DeleteSession(HttpContext);
    return binding.Bind(saml2LogoutRequest).ToActionResult();
}

Auth 控制器中的 LoggedOut 方法 注销成功或失败后,注销方法会收到响应。

[Route("LoggedOut")]
public IActionResult LoggedOut()
{
    var binding = new Saml2RedirectBinding();
    binding.Unbind(Request.ToGenericHttpRequest(), new Saml2LogoutResponse(config));

    return Redirect(Url.Content("~/"));
}

Auth 控制器中的 SingleLogout 方法 接收单一注销请求并发送响应。

[Route("SingleLogout")]
public async Task<IActionResult> SingleLogout()
{
    Saml2StatusCodes status;
    var requestBinding = new Saml2RedirectBinding();
    var logoutRequest = new Saml2LogoutRequest(config, User);
    try
    {
        requestBinding.Unbind(Request.ToGenericHttpRequest(), logoutRequest);
        status = Saml2StatusCodes.Success;
        await logoutRequest.DeleteSession(HttpContext);
    }
    catch (Exception exc)
    {
        // log exception
        Debug.WriteLine("SingleLogout error: " + exc.ToString());
        status = Saml2StatusCodes.RequestDenied;
    }

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