使用Controller的单页应用程序 - 如何使用ASP.NET标识进行保护?

时间:2013-11-08 22:31:12

标签: asp.net-mvc breeze single-page-application asp.net-identity

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

1 个答案:

答案 0 :(得分:3)

声明

这是一个相对简单的问题,因为它非常具体,通过理解Web API和MVC控制器之间的身份验证差异,这应该是相当直接的。

假设

  1. 您的Web API项目拥有自己的身份验证,并且不与MVC项目通信以获取会话用户或任何内容
  2. 您的ASP.NET MVC控制器位于使用表单身份验证并将用户存储在会话cookie中的项目中。
  3. 当我在下面引用MVC时,您将继续引用ASP.NET MVC
  4. 建议

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

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

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

    现在,您的MVC项目中存储在会话中的用户可以将其传递给客户端,并将其附加到Breeze调用Web API并将其用于身份验证。您将需要明确设置该令牌的持续时间等,但很容易将其附加到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

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