SSO 在旧的 ASP.NET Web 表单网站中

SSO In an old ASP.NET Web Forms website

上下文:

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

问题:

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

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

根据我的阅读,IdentityServer3 客户端(在 .NET 核心之前)应该与 IdentityServer4(在 .NET 核心上必须 运行)一起工作,并将成功地与 IdentityServer4 对话。

因此,我通过 ajax 将登录时的用户凭据发送到身份服务器,设法解决了我的问题。我制作了一个 webapi 控制器来验证用户并发回 'set-cookie' 对 idsrv 身份验证 cookie 的响应 headers。

现在我已经登录到原始应用程序以及身份服务器,用户无需手动登录两次。 你只需要处理一堆 Cross-Origin-Requests 的东西。在为应用程序设置 CORS 策略时必须设置 "AllowCredentials" 以发出 ajax 请求,以便 'set-cookie' headers 实际应用。

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

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