新文章 网摘 文章 随笔 日记

为您的ASP.NET MVC应用构建单点登录

因此,您有兴趣对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应用程序。克隆或下载此项目,然后在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后,注册您的客户端应用程序。

  • 在顶部菜单中,单击“ 应用程序”
  • 点击添加应用
  • 选择网站,然后单击下一步。
  • 输入SSO MVC 5名称
  • 对于允许授予类型,选中“ 隐式(混合)”复选框
  • 点击完成

您的应用程序已创建,但是您仍然需要添加其他内容。选择“ 编辑”,添加http://localhost:8080/Account/PostLogout到“ 注销重定向URI ”列表中,然后单击“ 保存”

在下一个屏幕上,您将看到设置概述。在“ 常规设置”部分下方,您将看到“ 客户端凭据”部分。使用客户端ID客户端机密更新您服务器中的SSO设置Web.config然后转到Okta 仪表板主页,复制左上角显示组织URL,然后将其粘贴到的okta:OktaDomain应用程序设置中Web.config

此时,您应该能够运行该应用程序并使用OpenID Connect登录和注销。如果您好奇,可以Startup.cs看看如何配置身份验证中间件。

获取ASP.NET Core应用

现在,您使用Okta登录到MVC 5应用程序,为第二个应用程序添加SSO变得很简单。

首先从GitHub 下载或克隆此.NET Core应用在Visual Studio中打开它时,请将调试目标从IIS Express更改LiveMusicFinder

使用茶est

这将导致该应用通过端口5001上的Kestrel Web服务器运行(对于https)。

现在返回Okta管理面板并注册该应用程序。

  • 在顶部菜单中,单击“ 应用程序”
  • 点击添加应用
  • 选择网站,然后单击下一步。
  • 输入SSO Core MVC名称
  • 基本URI替换https://localhost:5001/
  • 登录重定向URI替换https://localhost:5001/authorization-code/callback
  • 点击完成

完成后,您将看到应用程序的“ 常规设置”选项卡。在该选项卡中单击编辑按钮,并加入到一个条目注销重定向的URIhttps://localhost:5001/signout/callback然后点击保存

下一页的“ 客户端凭据”部分复制您的客户端ID客户端密钥,然后在应用程序中更新文件。appsettings.json

"Okta": {
  "ClientId": "{yourClientId}",
  "ClientSecret": "{yourClientSecret}",
  "OktaDomain": "https://{yourOktaDomain}",
  "PostLogoutRedirectUri": "https://localhost:5001/"
},

在编辑设置时,请更新OktaDomain设置以匹配您在Web.configMVC 5应用程序中输入的设置。同时将更PostLogoutRedirectUri改为https://localhost:5001/

真的就是全部。现在,当您登录两个应用程序之一时,单击Log in另一个应用程序上的链接将自动登录,而无需提示输入密码。

(如果出于某些莫名其妙的原因要使用Internet Explorer进行测试,并且正在使用Visual Studio的自动启动功能,请确保在第一个浏览器窗口的选项卡中打开第二个应用程序。由于Visual Studio启动IE的特殊性,每个浏览器窗口彼此隔离。)

单一登录在ASP.NET MVC 5和ASP.NET Core中的工作方式

您已经看到了为两个ASP.NET应用程序启用SSO是多么简单,但是要使它起作用,幕后到底发生了什么?

假设您首先进入应用程序1并单击Log in应用程序1会将您重定向到您登录Okta IdP(身份提供商)。登录后,将在浏览器中为Okta的域设置cookie。该cookie使您可以登录Okta。然后Okta将使用令牌将您重定向回App 1,该令牌用于完成登录过程。此时,还将为App 1的域设置cookie。这是说明状态的图:

SSO图

接下来,在同一浏览器的另一个选项卡中打开App 2单击时Log in,您将再次重定向到Okta IdP但是这一次,因为您仍然有一个有效的cookie,所以您已经在IdP上登录了。因此,Okta不会向您显示登录屏幕,而只是使用完成本地登录过程所需的令牌将您重定向回App 2。在App 2的域上设置了cookie,并且您已登录到任何地方。

请注意,在撰写本文时,Okta不支持单个sign__out_。如果您退出应用程序1,则应用程序1的cookie将被删除,并且会快速调用Okta IdP来删除其中的cookie。但是,App 2的cookie仍将保留,直到您单击Log out或cookie到期之前,您仍将登录App 2 默认有效期为30天。

ASP.NET OpenID Connect流程介绍

您可能已经注意到,当设置MVC 5应用程序的配置时,必须勾选一个复选框以启用“ 隐式(混合)”授予类型,但是对于.NET Core应用程序则没有。

几年前(在软件界很长一段时间)为MVC 5编写OpenID Connect中间件时,它实现了OpenID Connect 混合流,这需要IdP向MVC 5应用程序发送授权代码和身份令牌。将用户重定向回应用程序时。

编写用于.NET Core的OpenID Connect中间件时,它实现了更安全的授权代码流。在这种情况下,IdP仅返回授权码,并且中间件必须通过对IdP的反向通道请求来获取身份令牌。这意味着身份令牌不会暴露给浏览器。

如果要在身份令牌中传递任何敏感信息,请注意,在MVC 5中,该令牌是通过浏览器传递回应用程序的,好奇的用户或恶意脚本可能会在浏览器中看到该令牌。如果要在.NET Core应用程序之间启用SSO,则不是问题。

了解有关单点登录和ASP.NET的更多信息

有兴趣了解有关ASP.NET,单点登录或使用Okta构建安全应用程序的更多信息吗?查看我们的产品文档或以下任何出色的资源:

https://developer.okta.com/blog/2019/07/16/build-single-sign-on-sso-for-your-aspnet-mvc-apps

posted @ 2020-07-25 05:14  岭南春  阅读(307)  评论(0)    收藏  举报