3

我有一个单页应用程序,它使用标准控制器(不是 ApiController)来检索所有 HTML 视图,这是通过 ajax 完成的。然而,WebApi 是通过使用轻风js 让客户端与后端数据库进行对话的。我正在实现 ASP.NET 身份安全 - 我应该使用 MVC cookie 身份验证还是不记名令牌?我需要解决方案来说明一个单独的登录页面,并且需要一个干净的服务器端重定向。

4

1 回答 1

3

免责声明

这是一个相对微不足道的问题,因为它非常具体,并且通过了解 Web API 和 MVC 控制器之间的身份验证差异,这应该是相当直截了当的。

假设

  1. 您的 Web API 项目有自己的身份验证,并且不与 MVC 项目对话以获取会话用户或任何东西
  2. 您的 ASP.NET MVC 控制器位于使用表单身份验证并将用户存储在会话 cookie 中的项目中。
  3. 当我在下面引用 MVC 时,您知道这些是在引用 ASP.NET MVC

推荐

我要做的是让您的 MVC 项目使用 OAuth 进行身份验证,并将用户存储在您可以设置和获取的会话中的 cookie 中。然后可以使用 Authorize 属性修饰为视图提供服务的控制器操作。当用户尝试访问不允许访问的视图时,这会将用户重定向到登录页面(只要在您的 web.config 中进行了设置)

对于 Web API 项目,您不能依赖 Session,因为听起来您正在将两个项目解耦。这是我的建议——

当您的用户在您的 MVC 项目中成功通过身份验证时,请向 Web API 请求打开登录方法。这将进行一些逻辑测试,然后使用某种会话令牌将用户存储在数据库中,或者自动将用户写入数据库。

现在,您的用户存储在 MVC 项目的会话中,您可以将其传递给客户端,并将其附加到对 Web API 的 Breeze 调用中,并将其用于身份验证。您将需要明确设置该令牌的使用时间等,但很容易将其附加到 Breeze.js 调用中,如下所示 -

 var query = breeze.EntityQuery.from('myService').withParameters({'tokenId': thisTokenId});

现在,您的查询将使用可用于身份验证的 tokenId 参数访问 API。

编辑

如果您想设置您的 ASP.NET MVC 项目以使用 OAuth,您可以跟随此链接 -

http://www.asp.net/mvc/tutorials/security/using-oauth-providers-with-mvc

请记住,基于表单的身份验证仅意味着(简而言之)您将为用户提供某种使用某种形式的登录方式。

于 2013-11-11T17:49:23.857 回答