我需要使用测试 SAML 身份提供商 (IDP) 并利用 .NET 4.7 和 MVC Web 应用程序来创建和测试 SAML SSO 工作流程。 我的场景是,我将与自定义 IDP 集成,目前我还没有详细信息,但是,我需要开始创建 SSO 工作流程进行测试,以便我们稍后可以与实际提供商集成。
我的要求是:
我没有找到任何显示与模拟提供商集成的所有部分以及要使用的工具的问题,因此我创建这个问题来发布我找到的解决方案,希望能够帮助其他人。 如果其他人找到了其他解决方案,也请随时发布。
还有其他提供商,但我发现能够成功集成的提供商是:
第 1 步 - 获取 MockSAML 详细信息
第 2 步 - 添加 ITfoxtec.Identity.Saml2.Mvc
第 3 步 - 更新您的 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 身份验证
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,以便身份验证工作流程将直接返回您的站点。
花了一些尝试和错误来弄清楚这些部分,所以希望它对其他人有帮助。