Sustainsys.Saml2.Owin : 在一个网站上有两个不同的服务提供商

Sustainsys.Saml2.Owin : Having two different service providers in one website

我正在为 SSO 配置我的网站,使其成为单个身份提供商的服务提供商。

我使用的是 .NET MVC 4.7.2 并且我使用了 Sustainsys.Saml2

单个服务提供商一切正常。

问题出在我的 SaaS 架构的工作方式上。我有一个单一配置的网站(使用 IIS),并且有不同的域名进入该网站。

然后我使用请求 url.

询问客户端共享数据库我必须使用哪个连接字符串

我不知道这种 运行 SaaS 架构的方式是否正确,但无论如何,由于我只有一个 IIS 网站,我不知道如何为每个客户端添加 Saml2 配置(只有服务提供商 entityId 和 returnUrl 会有所不同)。

我想做这样的事情:

public partial class Startup
{
    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseSaml2Authentication(CreateSaml2OptionsClient1());
        app.UseSaml2Authentication(CreateSaml2OptionsClient2());
    }
}

遗憾的是,第一次调用 UseSaml2Authentication 似乎设置了配置,第二次调用什么也没做。

我也考虑过通过获取请求 url 并加载客户端特定的 Saml2 配置来调节这些调用 (app.UseSaml2Authentication(CreateSaml2OptionsClient1());),但是在启动时我既无法访问请求 url 也不是我的数据库上下文。

有没有办法在保持我的 SaaS 架构的同时拥有多个 Saml2 配置或调整正在使用的配置?

我需要的是让我的网站 website-a.com/Saml2 具有 entityId = website-a.com/Saml2 和 idp = IDP1 以及我的网站-b.com/Saml2 entityId = website-b.com/Saml2 和 idp = IDP1,所有这些都在一个 IIS 网站中。

您需要换个角度看,您尝试添加多个 saml 配置,但您需要设置您将要使用的身份提供者,并且您可以在每个身份提供者上配置其 saml 配置,因此每个身份提供者只有一个配置

在你的启动中你需要使用这样的东西(取决于你使用的版本)

app.Map("/identity", a =>
{
    a.UseIdentityServer(new IdentityServerOptions
    {
        AuthenticationOptions = new AuthenticationOptions
        {
            IdentityProviders = ConfigureMyIdentityProviders
        }
    });
});

ConfigureMyIdentityProviders 只是您设置每个身份提供者配置的方法,您需要在客户端设置它:

private void ConfigureMyIdentityProviders(IAppBuilder appBuilder, string signInAsType)
{
    var myIdentityProviders = // the list of your identity providers;


    foreach (var idp in myIdentityProviders)
    {
        // here you'll set the configuration per identity provider
        app.UseSaml2Authentication(CreateSaml2Options(idp));
    }
}

我建议您创建一个通用方法,并在其中传递您的 idp 信息,您可以在其中对每个客户端进行所需的验证。

我找到了解决问题的方法。

我所做的是在我的 Startup class 中有两个 app.Map,在两个不同的 uris 上,每个都具有不同的 Saml2 配置(只有身份提供者不同)。

app.Map("uri1", a => {
    a.UseSaml2Authentication(CreateSaml2Options(client1));
});
app.Map("uri2", a => {
    a.UseSaml2Authentication(CreateSaml2Options(client2));
});

这是可行的,因为 client1 插入 uri1,client2 插入 uri2,但问题是 client1 可以访问 uri2,反之亦然。