使用REST对ACS的Microsoft帐户用户进行身份验证

时间:2013-03-11 20:10:46

标签: authentication azure acs

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

我发现了很多关于ACS的资源,但大多数都是围绕在UI层使用WIF /使用托管代码来验证用户。我想避免这种情况。是否可以通过使用javascript / jQuery对ACS进行基于REST的调用来检索来自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 Account / ACS用户令牌,完全绕过UI层第二服务请求。服务层将使用每个请求对用户进行身份验证。
  4. 客户端可以通过重定向到登录页面或显示结果来处理服务层的响应代码(200,401等)。
  5. 我不确定第2步。客户端浏览器如何从ACS检索可以传递给服务层的令牌?

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

2 个答案:

答案 0 :(得分:1)

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

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

希望这会有所帮助。 -Rick

答案 1 :(得分:1)

我在阅读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项目中创建一个Action,它使用Authorization标头中的令牌向Web API发送请求。您的Web API配置为读取传入请求的Authorization标头,使用JWTTokenHandler验证令牌,然后您就完成了。您可以从此代码示例(特别是Global.asax.cs中的代码)中窃取Web API部分的大部分代码:http://code.msdn.microsoft.com/AAL-Native-Application-to-fd648dcf