【问题标题】:How to implement single logout using http-redirect如何使用 http-redirect 实现单点注销
【发布时间】:2020-08-20 19:59:13
【问题描述】:

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

提前感谢您的帮助!

【问题讨论】:

    标签: asp.net itfoxtec-identity-saml2


    【解决方案1】:

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

    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();
    }
    

    【讨论】:

    • 嗨……当我从 webapp 注销时……它正在重定向回单注销方法……因为注销已经发生,所以它失败了。在 IDP 上的 SingleLogout 设置中,我有 slo 端点 localhost:44327/Auth/SingleLogout....I 认为这仅在另一个 saml2 应用程序注销时才被调用
    • 然后需要更改 IdP 配置,它应该在注销后返回到 LoggedOut 端点。大概有两个logout字段,一个用于LoggedOut(可能称为response),一个用于SingleLogout(可能称为request)。
    • 谢谢....所以如果我想将其包含在现有的 .ASPNet 4.5.2 应用程序中,是否只需要包含 ITfoxtec.Identity.Saml2 和 TestIdPCore 项目?至于依赖关系,什么是最低限度的框架?我看到解决方案中包含 .NETCoreApp 2.1、.NETCoreApp 2.2、.NETCoreApp 3.0、.NETCoreApp 3.1、.NETFramework 4.6.2、.NETFramework 4.7.2 和 .NETStandard 2.1。现在这个应用程序使用的是 VS 2017,它只支持 .NET Core 2.0、1.1 和 1.0,不支持 .NETStandard 2.1...我必须升级到 VS 2019 吗?
    • 您好,我使用的第三方 IDP 仅支持 sha1 证书。 RsaSha1Signature 在 Saml2Securitylgorthim.cs 中定义为“w3.org/2000/09/xmldsig#rsa-sha1”,但是当我使用 OpenSsl 创建 sha1 证书时,它是使用算法“w3.org/2001/04/xmldsig-more#rsa-sha1”创建的。我尝试将 Saml2Securitylgorthim.cs 中的 RsaSha1Signature 更新为 w3.org/2001/04/xmldsig-more#rsa-sha1,但我不断收到“无法为提供的签名算法创建签名描述”。 ComputeSignature 函数中的错误。如何克服这个问题?
    • 感谢您的帮助...是否有非联合会话身份验证选项?我们的 API 在 FederatedAuthentication 后面存在问题。我们的匿名开放端点 API 方法被阻止,因为它需要在标头中包含 FedAuth 和 FedAuth1 cookie。反正周围有吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 2022-01-14
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多