【问题标题】:Best way to implement a button for the SP request to the IdP?为 IdP 的 SP 请求实现按钮的最佳方法是什么?
【发布时间】:2021-08-04 22:12:19
【问题描述】:

所以我要先说 SAML(和一般的用户身份验证)不是我的强项,所以我对任何滥用的术语表示歉意。

背景:

我们目前有一个 ASP.Net Framework 网站,使用 .Net 版本 4.7.2(特别是 webforms)。我们的网站充当服务提供商 (SP),目前使用 SAML 2.0 和已弃用的身份提供商 (IdP);幸运的是,这个身份提供者正在被 Okta 取代。最初的 IdP 提供了他们自己的实施说明,使用了 OWIN 中间件和他们自己的 NuGet 包,为我们配置了 SAML。不过,对于 Okta,我发现我们需要使用不同的 NuGet 包。我已经开始使用 SustainSys.Saml2 包配置 SAML,并对 web.config 进行了建议的更改(这是我们对使用他们的 OWIN 中间件的偏好,尽管我对此持开放态度,if这是有特定原因的)。如需更多参考,这里是我引用的sustainsys documentation

当前问题:

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

谢谢

【问题讨论】:

  • Owin 中间件的 Sustainsys 文档讨论了 Startup.Auth.cs 的配置。你试过了吗? saml2.sustainsys.com/en/stable/owin-middleware.html
  • 是的,我添加了 app.UseSaml2Authentication(new Saml2AuthenticationOptions(true));线;据我了解,这表示配置来自 web.config 文件(在我们的情况下是理想的)。 OWIN 中间件似乎没有概述添加之后要做什么(在那里配置 SAML 或调用配置文件)。
  • github.com/Sustainsys/Saml2/tree/master/Samples/….. 这个示例应用程序在 MVC 中,他们已经在代码中加载了配置,而不是从 web 配置中加载。我建议您仔细阅读此代码并将其作为 POC 在您的测试应用程序中实现。一旦成功,您就可以将代码集成到您的主应用程序的网络表单中。
  • 你搞定了吗?
  • 不,我实际上感到更加困惑。我认为(显然)有很大一部分 SAML 和 OWIN 身份验证概念在我脑海中浮现。我一直在努力寻找可以为我进一步分解这些概念的教程

标签: configuration webforms saml-2.0 okta sustainsys-saml2


【解决方案1】:

要让 Sustainsys.Saml2 库启动身份验证过程,您应该使用 Owin 身份验证基础架构来发起质询。这是一个通用的 Owin 身份验证概念,这就是为什么它没有记录在 Sustainsys.Saml2 库中的原因。

请看https://docs.microsoft.com/en-us/previous-versions/aspnet/dn343601(v=vs.113)

【讨论】:

    【解决方案2】:

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

    Login.aspx.cs

    如果有多个外部登录提供商相应地处理代码。

    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

    再次不能完全确定 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 OWIN 中间件。该代码可能没有所有必要的安全检查/最佳实践。我一直在学习它。
    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 2010-09-24
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2013-08-21
    相关资源
    最近更新 更多