【问题标题】:SSO In an old ASP.NET Web Forms websiteSSO 在旧的 ASP.NET Web 窗体网站中
【发布时间】:2018-02-14 18:38:49
【问题描述】:

上下文:

我工作的公司希望通过使用授权代码授权的第三方实现单点登录功能。我们现在的产品是在 .NET Framework 4.0 中构建的,在 ASP.NET Web 窗体应用程序中使用窗体身份验证。

问题:

有没有一种方法可以实现单点登录,而无需用户登录两次(一次通过表单身份验证,另一次通过身份服务器)? 详细来说,有没有办法让身份服务器在用户通过表单身份验证成功登录后自动对用户进行身份验证?

【问题讨论】:

  • 我现在也在做类似的事情。我有一个 .NET(非核心)MVC 项目,我正在尝试使用 .NET 核心上的 IdentityServer4 处理其中一个流程(现在不太在意哪个流程)。我试图让集成测试项目工作,但它抛出了各种异常(因为这是在我的本地机器上,我还没有安装 SSL/https)。
  • 找到了这个,在客户端有一点 IdSvr4 主机的客户端配置:stackoverflow.com/questions/48365146/…
  • 发现这个对话 - IdSvr3 客户端应该与 IdSvr4 一起工作,所以也许我的大部分问题只是与没有 TLS 相关。 gitter.im/IdentityServer/…

标签: webforms forms-authentication identityserver4


【解决方案1】:

这是 IdSvr3 网络表单客户端:https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source/Clients/WebFormsClient

根据我的阅读,IdentityServer3 客户端(在 .NET core 之前)应该与 IdentityServer4(必须在 .NET core 上运行)一起使用,并且可以成功地与 IdentityServer4 通信。

【讨论】:

  • 您只需要弄清楚您想要哪个流程并为此在 IdentityServer 主机端添加一个客户端配置,然后从您的 webforms 客户端引用它。
  • 看起来该项目遵循带有一些初始 OWIN 设置的隐式授权流程。不幸的是,我将无法将我们的产品迁移到 .NET 4.0 之后...而且,我无法完全替换我们当前拥有的当前表单身份验证。我希望有一种方法,当我可以维护两个身份验证 cookie,一个来自我们使用表单身份验证的原始产品,第二个使用身份服务器 4。这是可能的,但用户必须登录两次,一次通过表单身份验证,然后再次通过身份服务器
  • 还有其他几个客户端,可能可以使用其中之一,只需将方法放在适当的位置以进行 webform 设置。这是我目前为 MVC 项目配置的一个:github.com/IdentityServer/IdentityServer3.Samples/tree/master/…
  • 尝试只替换启动配置,看看会发生什么。
  • 问题是我没有能力实现任何 OWIN 的东西,因为我受限于使用 .NET 4.0。这意味着没有启动配置
【解决方案2】:

所以我设法通过 ajax 将登录时的用户凭据发送到身份服务器来解决我的问题。我制作了一个 webapi 控制器,它对用户进行身份验证并为 idsrv auth cookie 发回“set-cookie”响应标头。

所以现在我已登录原始应用程序以及身份服务器,而无需用户手动登录两次。 你只需要处理一堆跨域请求的东西。在为应用程序设置 CORS 策略以发出 ajax 请求时必须设置“AllowCredentials”,以便实际应用“set-cookie”标头。

$.ajax({
    method: 'GET',
    url: 'https://localhost:44304/api/login?username=testing&password=testing',
    crossDomain: true,
    xhrFields: {
        withCredentials: true
    }
})

api/login 端点在只调用HttpContext.SignInAsync() 扩展方法的控制器中定义。

【讨论】:

  • 可能有一种更安全的方式来传递凭据,而不是让它们直接通过查询字符串 =P 传递。
  • 它是反模式。黑客可以暴力破解您的 ID 服务器。
  • 是的,ad0ran,我很高兴你找到了一种与服务器通信的方法,很抱歉我无法为你提供更多帮助(我自己过去曾在类似的环境中工作过)。 IdentityServer 确实需要一种与您的客户端 webapp 反向通道通信的方法来保护连接。如果您有任何方法可以做到这一点,那么这是您可以获得的最安全的方法,因为正在进行三向对话。我会与您的服务器管理员交谈并尝试以某种方式获得受信任的连接。
猜你喜欢
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多