Configuration 实现SP向IdP请求按钮的最佳方法?

Configuration 实现SP向IdP请求按钮的最佳方法?,configuration,webforms,saml-2.0,okta,sustainsys-saml2,Configuration,Webforms,Saml 2.0,Okta,Sustainsys Saml2,因此,我要先说SAML(以及一般的用户认证)不是我的强项,所以我为任何误用的术语道歉 背景: 我们目前有一个ASP.Net Framework网站,使用.Net版本4.7.2(特别是webforms)。我们的网站充当服务提供商(SP),目前使用SAML2.0和不推荐的身份提供商(IdP);幸运的是,这个身份提供者正被Okta取代。最初的IdP提供了他们自己的实现说明,使用OWIN中间件和他们自己的NuGet包为我们配置SAML。但对于Okta,我发现我们需要使用不同的NuGet包。我已经开始使用

因此,我要先说SAML(以及一般的用户认证)不是我的强项,所以我为任何误用的术语道歉

背景:

我们目前有一个ASP.Net Framework网站,使用.Net版本4.7.2(特别是webforms)。我们的网站充当服务提供商(SP),目前使用SAML2.0和不推荐的身份提供商(IdP);幸运的是,这个身份提供者正被Okta取代。最初的IdP提供了他们自己的实现说明,使用OWIN中间件和他们自己的NuGet包为我们配置SAML。但对于Okta,我发现我们需要使用不同的NuGet包。我已经开始使用这些包对SAML进行配置,并对web.config进行了建议的更改(这是我们对使用其OWIN中间件的偏好,尽管我对此持开放态度,如果有具体原因的话)。作为补充参考,这里是我刚才提到的

当前问题:

web.config修改和其他更改(如安装NuGets)已完成,网站已清理,以免造成任何错误。然而,我最大的问题是如何把这一切联系起来。我理解我们的网站(SP)需要向Okta(IdP)提出SAML断言的请求。不幸的是,我不明白我需要为那个请求发送什么。我在想,只需一个指向IdP SSO链接的超链接就可以了,但从我读到的关于SAML的内容来看,需要一些与该请求相关的元数据。有人能建议如何创建一个按钮来发送必要的元数据吗?或者澄清是否需要包括这些内容(也许我误解了需要发送的内容)?此外,任何与sustainsys相关的附加链接或帮助(特别是html或其他显示元素)都将非常有益


谢谢

我尝试创建一个示例Web表单项目,并使用连接到Okta。下面的代码只是一个POC,它从Webform应用程序重定向到OKTA登录页面,并将响应返回到OKTA中配置的“单一登录URL”。代码可能没有所有必要的安全层。(安全戳、验证间隔)

Login.aspx.cs

public class Startup
{
    public void Configuration(IAppBuilder app)
    {         
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
        });
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
        app.UseSaml2Authentication(new Saml2AuthenticationOptions(true));      
    }       
}
如果有多个外部登录提供程序,则相应地处理代码

public partial class Login : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {

        IAuthenticationManager AuthenticationManager = HttpContext.Current.GetOwinContext().Authentication;

        var loginProvider = AuthenticationManager.GetExternalAuthenticationTypes()                         
                                                 .FirstOrDefault();

        AuthenticationManager.Challenge(loginProvider.AuthenticationType);
    }
}
Okta成功认证后发送的SAML的屏幕截图,使用Chrome扩展捕获

Startup.Auth.cs

public class Startup
{
    public void Configuration(IAppBuilder app)
    {         
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
        });
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
        app.UseSaml2Authentication(new Saml2AuthenticationOptions(true));      
    }       
}
LoginCallback.cs

public class Startup
{
    public void Configuration(IAppBuilder app)
    {         
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
        });
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
        app.UseSaml2Authentication(new Saml2AuthenticationOptions(true));      
    }       
}
同样,我也不完全确定什么代码进入LoginCallback。但我只是检查了用户是否经过身份验证

public partial class LoginCallback : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {
        IAuthenticationManager AuthenticationManager = HttpContext.Current.GetOwinContext().Authentication;

        bool isAuthenticated = AuthenticationManager.User.Identity.IsAuthenticated;                   
    }
}

要让Sustainsys.Saml2库启动身份验证过程,您应该使用Owin身份验证基础结构来发起质询。这是Owin auth的一般概念,因此Sustainsys.Saml2库中没有对其进行记录


请参阅Owin中间件的Sustainsys文档,其中介绍了Startup.Auth.cs的配置。你试过了吗?是的,我添加了app.UseSaml2Authentication(新的Saml2AuthenticationOptions(true));线路;根据我的理解,这意味着配置来自web.config文件(在我们的情况下非常理想)。不过,OWIN中间件似乎并没有概述添加后要做什么(在那里配置SAML或调用配置文件)。。。这个示例应用程序在MVC中,它们以代码而不是web配置加载配置。我建议您仔细阅读这段代码,并在测试应用程序中将其作为POC实现。一旦成功,你就可以将代码集成到你的主应用程序的webforms中。你让它工作了吗?不,我实际上觉得更困惑了。我认为(显然)SAML和OWIN auth概念的很大一部分正在我的脑海中浮现。我一直在寻找可以进一步分解这些概念的教程,因为meThis是我第一次尝试sustainsys OWIN中间件。代码可能没有所有必要的安全检查/最佳实践。我一路上都在学习。对于一般的Owin auth概念,你们还有其他的资源吗?我不明白添加Challenger方法的目的,也不明白为什么sustainsys文档中至少没有提到它