混合MVC / Web Api控制器站点中的AspNet Identity

时间:2015-03-05 23:35:37

标签: asp.net-mvc asp.net-identity asp.net-web-api

我有一个利用mvc和web api控制器以及aspnet身份的站点。我使用VS2013 SPA模板将mvc和web api控制器作为起点。

以下是我的情景:

用户使用mvc控制器登录并获取一个身份验证cookie。

使用经过身份验证的mvc控制器提供下一页。该页面使用knockout并对一个web api控制器进行ajax调用,该控制器通过按钮单击(保存)进行身份验证。 web api控制器需要带有Bearer --token - 的身份验证标头。

我的问题是其他人如何处理这种“两种”身份验证方法。我在经过身份验证的mvc控制器上创建了一个端点,并根据当前主体返回一个承载令牌。我可以使用该令牌成功发布到Web api端点。

我正在创建的javascript逻辑有点令人困惑。它检查访问令牌是否在会话存储中,如果是,则进行ajax调用。如果没有,请调用get令牌端点,然后调用web api端点(使用一堆回调来处理Ajax承诺,失败,等等)。

其他人如何处理您需要auth cookie和bearer令牌的场景,以便对每个“mvc”页面进行身份验证,并对页面调用的web api端点进行身份验证。如果持票人令牌在cookie到期之前到期,您会怎么做。

如果我不清楚或者您是否需要更多信息,请告诉我。

修改

我遇到了这个,Using bearer tokens and cookie authentication together 它仍然没有回答我的问题,因为我已经设置好了所以mvc接受cookie auth而web api只接受bearer token。我觉得这应该是一个已经解决的问题,但也许我采取了错误的方法。

2 个答案:

答案 0 :(得分:2)

我认为你基本上遇到了OAuth2.0的核心问题。 OAuth2.0只是授权协议。您需要的是一个支持身份验证授权的安全模型。

介绍OpenId Connect

OpenId Connect是基于OAuth2.0授权层构建的身份验证层。它提供了一种基于在后台服务器/服务上执行的身份验证来验证最终用户的简单方法。此外,它还能够将有关用户的基本配置文件传递给RESTful HTTP API,以便使用JSON进行授权。

  

" OpenId Connect允许一系列客户端,包括基于Web的客户端,   移动和JavaScript客户端,以请求和接收信息   关于经过身份验证的会话和最终用户。规范套件是   可扩展,支持可选功能,如加密   身份数据,OpenID提供商的发现和会话管理。"    - Wikipedia

对于.NET,有一个名为IdentityServer3 Identity Server组件的Nuget包。关于如何使用IdentityServer3运行简单的MVC / Web-API,有一个非常深入的getting started tutorial

网络应用与Web API和Cookie与代币

  • 通常,Web Apps是使用基于cookie的身份验证的传统服务器端应用程序。

  • 另一方面,Web API为我们提供了一种新的应用程序,通常是单页应用程序(如Angular,Ember,Backbone等)或本机移动应用程序(如iOS,Android等)。 )它使用API​​(用Node,Ruby,ASP.NET甚至混合编写),并将从基于令牌的身份验证中受益。

您可能希望阅读这些文章以获取更多背景信息:Cookies vs Tokens. Getting auth right with Angular.JS10 Things You Should Know about Tokens

  • 基于Cookie的身份验证是由每个Web平台以不同方式实现的,但在一天结束时,他们最终都会设置一些cookie(绑定到服务器上的会话),代表"经过身份验证用户&#34 ;.在每个请求中,发送该cookie并从某个存储中反序列化会话(如果它是单个服务器则存储在内存中,如果它是服务器场则在内存中)。

  • 基于令牌的身份验证是通过在用户进行身份验证时生成令牌,然后在每个后续API请求的Authorization标头中设置该令牌来实现的。您希望该令牌是标准的,例如JSON Web令牌,因为您将在大多数平台中找到库并且您不想自己进行加密。

  • 对于这两种方法,您都可以从用户那里获得相同数量的信息。这是由登录请求中发送的scope参数控制的。

  • 您可以将基于令牌的身份验证与基于Cookie的身份验证混合使用。如果Web应用程序和API是从同一个域提供的,那么考虑到cookie将正常工作,因此您可能不需要基于令牌的身份验证。如果您想从JavaScript调用API(而不是使用现有的cookie),那么您必须在网页中设置id_token。一种方法是在你的布局/母版页上设置类似window.token =<%= id_token%&gt ;;然后你可以从JavaScript代码的任何地方获取它。

P.S这是关于这个主题的一个很棒的video,名为" Unifying Authentication&通过Dominick Baier"对OpenID Connect和OAuth2的移动,Web和桌面进行委托API访问。这应该有助于阐明OAuth2.0的局限性以及OpenId Connect如何尝试解决它们。

答案 1 :(得分:0)

我设法通过使用Cookie和刷新令牌解决了这个问题。

这就是它的完成方式,

  1. 加密并保存访问令牌&刷新cookie中的令牌。
  2. 在调用web api之前验证令牌到期日期。
  3. 如果令牌已过期,请使用刷新令牌/清除用户身份验证cookie获取新令牌并将其注销。
  4. 我还没有在VS2013 SPA模板中尝试过。 但是在我看来,您可以使用第二步验证令牌,如果它已过期,请调用mvc控制器端点以获取新的访问令牌。