SAML SSO 测试与 ITFoxTech 和 MockSAML 集成

问题描述 投票:0回答:1

我需要使用测试 SAML 身份提供商 (IDP) 并利用 .NET 4.7 和 MVC Web 应用程序来创建和测试 SAML SSO 工作流程。 我的场景是,我将与自定义 IDP 集成,目前我还没有详细信息,但是,我需要开始创建 SSO 工作流程进行测试,以便我们稍后可以与实际提供商集成。

我的要求是:

  1. 查找可与 .NET 4.7 MVC 配合使用的 SAML 库
  2. 找到一个测试 IDP,它允许我模拟工作流程测试的请求(很多问题提到不再可用的工具)

我没有找到任何显示与模拟提供商集成的所有部分以及要使用的工具的问题,因此我创建这个问题来发布我找到的解决方案,希望能够帮助其他人。 如果其他人找到了其他解决方案,也请随时发布。

c# asp.net-mvc saml itfoxtec-identity-saml2
1个回答
0
投票

还有其他提供商,但我发现能够成功集成的提供商是:

  1. ITfoxtec.Identity.Saml2.Mvc - 提供 .NET SAML 库
  2. MockSAML.com - 提供 SAML 2.0 测试 IDP

第 1 步 - 获取 MockSAML 详细信息

  1. 转到 https://mocksaml.com/namespace/ChangeThisToWhateverYouLike
  2. 命名空间后面的 URL 可以更改为您希望用于测试的任何内容。
  3. 此页面将为您提供 SAML 库配置所需的信息:IDPMetadata URL、Issuer/EntityID、SSO Url

第 2 步 - 添加 ITfoxtec.Identity.Saml2.Mvc

  1. 无论您如何管理包(Nuget Package Manager 等),请将 ITfoxtec.Identity.Saml2.Mvc 添加到项目中。我们将使用我们在步骤 1 中获得的测试 IDP 数据通过 web.config 进行配置

第 3 步 - 更新您的 web.config

  1. 将以下设置插入 web.config 的
    <appSettings>
    块中。 它们应该与您在步骤 1 中获得的任何内容相匹配。

<add key="Saml2:IdPMetadata" value="https://mocksaml.com/api/namespace/test/saml/metadata" /> 
<add key="Saml2:Issuer" value="https://saml.example.com/entityid/test" />
<add key="Saml2:SingleSignOnDestination" value="https://mocksaml.com/api/namespace/test/saml/sso"/> 
<add key="Saml2:SignatureAlgorithm" value="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /> 
<add key="Saml2:CertificateValidationMode" value="None" />

第 4 步 - 添加控制器来处理 SAML 身份验证

  1. 添加以下控制器,您将在应用程序中使用它来重定向到测试 IDP,然后让它将您发送回您的应用程序。 这个控制器可以进一步调整,它只是作为 .NET Saml 库和测试 IDP 之间非常基本的集成测试。您可能希望通过用户单击登录链接来执行此操作。您可能需要在 AssertionConsumerService 操作中执行特定于应用程序安全性的其他授权逻辑。这只是为了让您开始。

using ITfoxtec.Identity.Saml2.Mvc;
using ITfoxtec.Identity.Saml2.Schemas;
using ITfoxtec.Identity.Saml2;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IdentityModel.Services;
using System.Security.Authentication;
using System.Security.Claims;
using System.Web.Mvc;

namespace Test.Web.Controllers
{
    [AllowAnonymous]
    public class SamlAuthController : Controller
    {
        const string relayStateReturnUrl = "ReturnUrl";
        private readonly Saml2Configuration config;

        public SamlAuthController()
        {
            config = IdentityConfig.Saml2Configuration;
        }

        public ActionResult Login(string returnUrl = null)
        {
            string acsURL = string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~/SamlAuth/AssertionConsumerService"));
            var binding = new Saml2RedirectBinding();
            binding.SetRelayStateQuery(new Dictionary<string, string>
            {
                { relayStateReturnUrl, returnUrl ?? Url.Content("~/") }
            });

            return binding.Bind(new Saml2AuthnRequest(config)
            {
                AssertionConsumerServiceUrl = new Uri(acsURL)
            }).ToActionResult();
        }

        public ActionResult AssertionConsumerService()
        {
            var httpRequest = Request.ToGenericHttpRequest(validate: true);
            var saml2AuthnResponse = new Saml2AuthnResponse(config);

            httpRequest.Binding.ReadSamlResponse(httpRequest, saml2AuthnResponse);
            if (saml2AuthnResponse.Status != Saml2StatusCodes.Success)
            {
                throw new AuthenticationException($"SAML Response status: {saml2AuthnResponse.Status}");
            }
            httpRequest.Binding.Unbind(httpRequest, saml2AuthnResponse);

            var relayStateQuery = httpRequest.Binding.GetRelayStateQuery();
            var returnUrl = relayStateQuery.ContainsKey(relayStateReturnUrl) ? relayStateQuery[relayStateReturnUrl] : Url.Content("~/");
            return Redirect(returnUrl);
        }

    }
}

网上的大多数示例都是当您拥有 IDP 颁发的有效证书时。 但是,在测试模拟 IDP 时,您可能没有有效的证书。 从 web.config 中删除证书设置(如本示例中所示)将允许 ITfoxtech 忽略该设置。 将其与无效的证书留在那里会导致错误。

此外,您还必须在绑定中设置 AssertionConsumerServiceUrl。Bind 以便在查询字符串中正确设置 ACSUrl,以便身份验证工作流程将直接返回您的站点。

花了一些尝试和错误来弄清楚这些部分,所以希望它对其他人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.