【问题标题】:Authenticate Microsoft Account user with ACS using REST使用 REST 通过 ACS 对 Microsoft 帐户用户进行身份验证
【发布时间】:2013-03-11 20:10:46
【问题描述】:

我想利用 ACS 对网站上的 Windows 帐户用户(以及最终来自其他身份提供商的用户)进行身份验证。

我找到了很多关于 ACS 的资源,但大多数都围绕使用 WIF/使用 UI 层中的托管代码来验证用户。我想避免这种情况。是否可以通过使用 javascript/jQuery 对 ACS 进行基于 REST 的调用来检索 Microsoft 帐户用户的令牌,从而从 ACS 检索令牌?

我看到的一个接近的例子是这个链接,但是它使用服务身份而不是利用身份提供者。 http://code.msdn.microsoft.com/windowsazure/MVC4-Web-API-With-SWT-232d69da

这是我的最终目标:

  1. 这个网站有两层,一个 UI 层 (MVC 4) 和一个服务层 (MVC WebAPI)。这两个层都需要在 Azure 中相互独立地进行扩展。
  2. 我想让 UI 层调用 ACS 来确定当前会话是否经过身份验证。如果是,我希望 ACS 将令牌返回给客户端。我想将该令牌存储在客户端上,以便在第 3 步中使用。
  3. 用户登录后,我想让客户端对服务层进行基于 REST 的调用,并在每个请求的标头中传递 Microsoft 帐户/ACS 用户令牌,为此完全绕过 UI 层第二次服务请求。服务层将对每个请求的用户进行身份验证。
  4. 客户端将通过重定向到登录页面或显示结果来处理来自服务层的响应代码(200、401 等)。

我不确定第 2 步。客户端浏览器如何从 ACS 检索令牌以传递给服务层?

我基本上想做 Vittorio 描述的 here,但我想使用 MVC4 网络应用程序而不是 Windows 8 商店应用程序。

【问题讨论】:

  • 谢谢瑞克和肖恩。我能够使用 Rick 提供给 Vittorio 博客的链接获得一个 sln。我想修改此 sln 以使用管理门户中的 ReturnURL 指向的控制器操作,以将令牌存储为 cookie。然后,我会向 svc 层发出 AJAX 请求,将存储在 cookie 中的令牌附加到每个请求的标头中。我遇到的问题是该操作在登录时没有被重定向到。我已经使用 ReturnURL 更新了 mgmt 门户,并使用“身份和访问”工具刷新了 web.config。我还缺少其他东西吗?
  • 登录后fiddler显示客户端被定向到/Login/Return,但是响应码是302,位置为/。然后主页加载。登录控制器中的返回操作永远不会被命中,并且登录控制器中的返回操作生成的 cookie 之后不会出现在客户端上。但是,如果我直接在登录控制器上点击返回操作,则会创建 cookie。

标签: authentication azure acs


【解决方案1】:

在第 2 步中,您的 MVC4 Web 应用程序是依赖方,因此依赖于主题/用户提供的令牌中的声明。因此,它实际上只是将用户重定向到 ACS 进行身份验证,而不是 UI 调用 ACS。无论如何,根据您的要求和描述,我相信这就是您正在寻找的解决方案。

http://blogs.msdn.com/b/vbertocci/archive/2013/01/09/using-the-jwt-handler-for-implementing-poor-man-s-delegation-actas.aspx

希望这会有所帮助。 -瑞克

【讨论】:

  • 感谢瑞克的建议。我正在查看您发送的链接,看看我是否可以让它工作。看起来很有希望。
  • 嗨瑞克。我研究了 Vittorio 的博客文章,并且能够使示例正常工作,但希望进一步扩展它。基本上,我无法让 ReturnURL 正常工作。我已经对我的原始问题添加了评论,并提供了更多详细信息。你知道这可能是什么原因吗?
【解决方案2】:

我在阅读 Rick 链接到的 Vittorio 的博客文章之前写下了这个答案。这似乎几乎是你想要的。无论如何,我都会回答以提供有关 WIF 的更多背景信息以及此方案的工作原理,但您应该查看该帖子。

首先,请务必注意,在您的 MVC 4 应用程序中使用 WIF 时,UI/表示层中不会发生身份验证或验证。 WIF 在请求层工作,如果您选择使用 Javascript 路线,您必须自己做很多事情(我认为这不是一个有效的路线,尽管它可能需要做很多工作)。

它是这样的:当用户点击需要身份验证的页面时,WIF 会将他们重定向到 ACS,然后您会被发送到 Google/Microsoft 以登录(身份提供者)。在您通过身份提供者进行身份验证后,ACS 会将生成的访问令牌和有关经过身份验证的用户的声明发送回您的应用程序(ACS 配置中的返回 URL)。最后,WIF 处理验证由 ACS 发送的令牌(不是小任务),并在您的应用程序中创建一个 ClaimsPrincipal 对象,该对象可用于识别用户。

听起来您想要的是模拟/委托,用户登录并且他们的凭据从前端传递到后端。对于这种情况,我认为您没有理由不只在 MVC 4 应用程序中使用 WIF 进行用户身份验证。用户进行身份验证并 WIF 处理/验证令牌(尽管因为您正在调用 Web API,您可能应该使用 JWTTokenHandler 来实现其轻量级)。您在 MVC 项目中创建一个操作,该操作使用 Authorization 标头中的令牌向您的 Web API 发送请求。您的 Web API 被配置为读取传入请求的授权标头,使用 JWTTokenHandler 验证令牌,然后您就完成了。您可以从此代码示例中窃取大部分 Web API 部分的代码(尤其是 Global.asax.cs 中的代码):http://code.msdn.microsoft.com/AAL-Native-Application-to-fd648dcf

【讨论】:

  • 感谢您的建议。您是否建议 UI 层验证令牌(但不验证用户的状态),然后将令牌传递给将发生用户状态验证(以及令牌验证)的服务层?在之前使用 Live SDK 实现的身份验证中,我让 UI 层将检索到的 MS 帐户令牌存储为 cookie。 UI 会将存储的令牌作为标头附加到服务层的每个请求中。作为“验证”令牌的一部分,服务层还将验证用户的状态。这种方法可以吗?我希望做类似的事情。
  • 您之前的实现与这里的情况非常相似。使用 WIF 和 ACS 设置一个普通的 MVC 4 Web 应用程序。确保它有效,您可以进行身份​​验证。然后,确保对 Web API 的请求将来自 ACS 的令牌附加到 Authorization 标头中。您可以使用 WIF 中的 BootstrapContext 获取当前令牌。然后在您的 Web API 中,将其配置为读取传入请求的 Authentication 标头。要验证 Web API 中的令牌,您需要 JWTTokenHandler 和 ACS 的证书(用于签署它发回的令牌)。这些东西在帖子中都有描述。
  • 感谢 seanost。根据 Vittorio 的博客文章,我只完成了创建 POC 的一半。今晚我会试着把它结束。
  • 嗨,肖恩。我完成了 Vittorio 博客文章的其余部分,并且能够使示例正常工作,但希望能进一步扩展它。基本上,我无法让 ReturnURL 正常工作。我已经对我的原始问题添加了评论,并提供了更多详细信息。你知道这可能是什么原因吗?
  • 登录后重定向到哪里?它要去某个地方。你有提琴手吗?
猜你喜欢
  • 1970-01-01
  • 2016-04-16
  • 2012-08-22
  • 2017-07-03
  • 1970-01-01
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
相关资源
最近更新 更多