我有一个单页应用程序,它使用标准控制器(不是 ApiController)来检索所有 HTML 视图,这是通过 ajax 完成的。然而,WebApi 是通过使用轻风js 让客户端与后端数据库进行对话的。我正在实现 ASP.NET 身份安全 - 我应该使用 MVC cookie 身份验证还是不记名令牌?我需要解决方案来说明一个单独的登录页面,并且需要一个干净的服务器端重定向。
1 回答
免责声明
这是一个相对微不足道的问题,因为它非常具体,并且通过了解 Web API 和 MVC 控制器之间的身份验证差异,这应该是相当直截了当的。
假设
- 您的 Web API 项目有自己的身份验证,并且不与 MVC 项目对话以获取会话用户或任何东西
- 您的 ASP.NET MVC 控制器位于使用表单身份验证并将用户存储在会话 cookie 中的项目中。
- 当我在下面引用 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
请记住,基于表单的身份验证仅意味着(简而言之)您将为用户提供某种使用某种形式的登录方式。