使用 ASP.NET MVC 和 ASP.NET Core 进行单点登录(.NET Core单点登录)
什么是单点登录 (SSO)?
用户必须对自己进行身份验证才能访问受 Web 应用程序保护的页面,如果用户访问多个 Web 应用程序,则必须对其进行身份验证。
使用 ASP.NET MVC 和 ASP.NET CORE 的单点登录
.NET Core单点登录,有兴趣为您的 ASP.NET MVC 应用程序使用单点登录 (SSO) 吗?你来对地方了。对同一组织拥有的自定义应用程序使用 SSO 的原因有很多。
- 改善用户体验。
- 减少开发时间。
- 提高了安全性。
这些都是很好的理由。
我喜欢 SSO 的另一件事是它允许我以小增量而不是一次全部更新大型代码库。
假设您要使用 ASP.NET MVC 5 编写的应用程序迁移到 ASP.NET Core MVC。您可以一次迁移一项服务,而不是一次重写所有内容。通过在两个应用程序之间实施 SSO,您可以有效地将两个应用程序连接起来,就好像它们是一个应用程序一样。
本教程通过在 MVC 5 应用程序和 .NET Core 应用程序中实现他的 SSO 来模拟这样的场景。在此过程中,您还将了解这两个平台在如何实现身份验证方面的差异。
查找 ASP.NET MVC 5 应用程序
从 GitHub 访问现有的 MVC 5 应用程序,而不是从头开始构建项目。克隆或下载此项目 (https://github.com/oktadev/aspnet-mvc-crud-example) 并在 Visual Studio 中打开解决方案。
Web.config文件包含一些应用程序设置,供程序员使用 Okta 提供的 Open ID Connect 服务器配置身份验证:
<add key="okta:ClientId" value="{yourClientId}" />
<add key="okta:ClientSecret" value="{yourClientSecret}" />
<add key="okta:OktaDomain" value="https://{yourOktaDomain}" />
对于本教程,您需要将这些值切换到您自己的 Okta 实例。如果您已有帐户,请登录到您的 Okta 域;如果您还没有,请注册一个永久免费的开发者帐户。
登录 Okta 后,注册您的客户端应用程序。
- 单击顶部菜单上的应用程序。
- 单击添加应用程序。
- 选择Web并单击下一步。
- 输入SSO MVC 5作为名称。
- 对于 允许的授予类型 ,请选中 隐式(混合) 复选框
- 最后点击完成
应用程序已经创建,但我们还需要添加一些东西。选择编辑并将 http://localhost:8080/Account/PostLogout 添加到注销重定向 URI列表,然后单击保存。
在下一个屏幕上,您将看到设置的摘要。在“常规设置”部分下,您将看到“客户端凭据”部分。使用您的客户端 ID和客户端密码更新Web.config中的 SSO 设置。接下来,转到 Okta 仪表板的主页,复制左上角显示的组织 URL,并将其粘贴到 Okta 中。
Web.config中的 OktaDomain 应用程序设置。
此时,您应该能够运行您的应用程序并使用 OpenID Connect 登录和注销。如果您有兴趣,请查看Startup.cs以了解身份验证中间件的配置方式。
查找 ASP.NET Core 应用程序
现在您正在使用 Okta 登录您的 MVC 5 应用程序,将 SSO 添加到您的第二个应用程序是微不足道的。
首先,从 GitHub 下载或克隆此 .NET Core 应用。(https://github.com/oktadeveloper/okta-aspnetcore22-crud-example) 如果在 Visual Studio 中打开,请将调试目标从 IIS Express 更改为 LiveMusicFinder。
这将通过端口 5001(对于 https)上的 Kestrel Web 服务器运行您的应用程序。
返回您的 Okta 管理面板并注册此应用程序。
- 单击 菜单顶部的应用程序
- 然后点击 添加应用
- 然后选择 Web 并单击 Next
- 输入 名称
SSO Core MVC
_ - 将 基本 URI 替换为
https://localhost:5001/
- 将 登录重定向 URI 替换为
https://localhost:5001/authorization-code/callback
- 点击 完成
完成后,您将被带到应用程序的“常规设置”选项卡。在此选项卡中,单击编辑按钮并将条目添加到注销重定向 URI,如https://localhost:5001/signout/callback。
然后单击保存。
从下一页的客户端凭证部分复制客户端 ID和客户端密码,并更新应用程序的appsettings.json文件。
"Okta": {
"ClientId": "{yourClientId}",
"ClientSecret": "{yourClientSecret}",
"OktaDomain": "https://{yourOktaDomain}",
"PostLogoutRedirectUri": "https://localhost:5001/"
},
在编辑设置时,更新OktaDomain设置以匹配您在 MVC 5 应用程序的Web.config中输入的内容。同时将PostLogoutRedirectUri更改为https//local host:5001/。
就是这样。当您登录任一应用程序时,单击另一个应用程序中的登录链接即可自动登录,而不会提示您输入密码。
(如果您莫名其妙地使用 Internet Explorer 和 Visual Studio 的自动启动功能进行测试,请确保您在第一个浏览器窗口的选项卡中打开她的第二个应用程序。。每个浏览器窗口都与其他窗口隔离,因为Visual Studio 启动 IE 的习惯。)
单点登录在 ASP.NET MVC 5 和 ASP.NET Core 中的工作原理
我们已经看到在两个 ASP.NET 应用程序中启用 SSO 是多么容易,但幕后真正发生了什么才能让它发挥作用?
假设您首先导航到App 1并单击“登录”。应用程序 1 重定向到它登录的Okta IdP(身份提供者)。当您登录时,您的浏览器中会设置来自 Okta 域的 cookie。此 cookie 让您登录到 Okta。然后,Okta 返回到 App 1,并带有用于完成登录过程的令牌。此时,她的 cookie 也设置在 App 1 域上。这是解释状态的图表:
然后在同一浏览器的另一个选项卡中打开应用程序 2 。单击登录,您将被重定向回Okta IdP。然而,这次我们仍然有一个有效的 cookie,所以我们已经登录到 IdP。因此,Okta 没有显示登录屏幕,而是使用完成本地登录过程所需的令牌简单地重定向到 App 2。cookie 设置在应用程序 2 的域上,您可以从任何地方登录。
请注意,在撰写本文时,Okta 不支持单点注销。当您退出应用程序 1 时,应用程序 1 中的 cookie 将被删除,并快速调用 Okta IdP,它会删除 cookie。但是,App 2 cookie 仍然存在并且您仍然登录到 App 2,直到您单击“注销”或 cookie 过期。默认有效期为 30 天。
解释 ASP.NET OpenID 连接流程
您可能已经注意到,当我为我的 MVC 5 应用程序设置配置时,我必须选中该框以启用隐式(混合)授权类型,但 .NET Core 应用程序则不然。
5 年前(在软件世界很久以前)为他的 MVC 编写 OpenID Connect 中间件时,实现了 OpenID Connect 混合流程。此流程要求 IdP 将授权代码和 ID 令牌传递给 MVC 5 应用程序提交。将用户重定向到您的应用程序时。
在为 .NET Core 编写 OpenID Connect 中间件时,它实现了更安全的授权代码流。在这种情况下,IdP 应该只返回授权代码,中间件应该通过向其 IdP 的反向通道请求获取 ID 令牌。这意味着 ID 令牌不会暴露给浏览器。请注意,如果您在 ID 令牌中传递敏感信息,在 MVC 5 中,此令牌将通过浏览器返回到您的应用程序。为他启用 SSO 以使用 .NET Core 应用程序时,这不是问题。
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!