我有一个单页应用程序,它使用标准控制器(不是ApiController)来检索所有HTML视图,这是通过ajax完成的。 但是,WebApi 使用 breezejs 用于客户端与后端数据库通信。我正在实施 ASP.NET 身份安全性 - 我应该使用 MVC cookie 身份验证还是持有者令牌?我需要解决方案来说明单独的登录页面,并且需要一个干净的服务器端重定向。
免责声明
这是一个相对微不足道的问题,因为它非常具体,通过了解 Web API 和 MVC 控制器之间的身份验证差异,这应该相当简单。
假设
- Web API 项目具有自己的身份验证,并且不会与 MVC 项目通信以获取会话用户或任何内容
- 您的 ASP.NET MVC 控制器位于使用窗体身份验证并将用户存储在会话 Cookie 中的项目中。
- 当我在下面引用 MVC 时,您理解这些引用 ASP.NET MVC
建议
我要做的是让您的 MVC 项目使用 OAuth 进行身份验证,并将用户存储在您可以设置和获取的会话中的 cookie 中。 然后,可以使用 Authorization 属性修饰为视图提供服务的控制器操作。 当用户尝试访问不允许访问的视图时,这会将用户重定向到登录页面(只要在您的 web.config 中设置了该视图)
对于 Web API 项目,您不能依赖会话,因为听起来您正在分离这两个项目。 这是我的建议——
在 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
请记住,基于表单的身份验证仅意味着(简而言之)您将为用户提供某种使用某种表单登录的方式。