1

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

提前感谢您的帮助!

4

1 回答 1

0

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

Auth Controller 中的注销方法

[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 Controller 中的 LoggedOut 方法 成功或失败注销后,已注销的方法会收到响应。

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

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

Auth Controller 中的 SingleLogout 方法接收 Single Logout 请求并发送响应。

[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();
}
于 2020-08-20T20:27:51.020 回答