我有一个单页应用程序,它使用标准 Controller (不是 ApiController)来检索所有 HTML View ,这是通过 ajax 完成的。然而,WebApi是使用breezejs来让客户端与后端数据库进行对话的。我正在实现 ASP.NET 身份安全 - 我应该使用 MVC cookie 身份验证还是不记名 token ?我需要解决方案来说明单独的登录页面,并且需要一个干净的服务器端重定向。
最佳答案
免责声明
这是一个相对简单的问题,因为它非常具体,并且通过了解 Web API 和 MVC Controller 之间身份验证的差异,这应该是相当简单的。
假设
- 您的 Web API 项目有自己的身份验证,不会与 MVC 项目通信来获取 session 用户或任何内容
- 您的 ASP.NET MVC Controller 位于使用表单例份验证并将用户存储在 session cookie 中的项目中。
- 当我在下面引用 MVC 时,您会明白这些是在引用 ASP.NET MVC
推荐
我要做的是让您的 MVC 项目使用 OAuth 进行身份验证,并将用户存储在您可以设置和获取的 session 中的 cookie 中。然后,可以使用 Authorize 属性来修饰为 View 提供服务的 Controller 操作。当用户尝试访问不允许的 View 时,这会将用户重定向到登录页面(只要在您的 web.config 中进行了设置)
对于 Web API 项目,您不能依赖 Session,因为听起来您正在将两个项目解耦。这是我的建议 -
当您的用户在 MVC 项目中成功通过身份验证后,向 Web API 发出开放登录方法的请求。这将进行一些逻辑测试,然后使用某种 session token 将用户存储在数据库中,或者自动将用户写入数据库。
现在,您的用户存储在 MVC 项目的 session 中,您可以将其传递给客户端,并将其附加到对 Web API 的 Breeze 调用中,并使用它进行身份验证。您需要明确设置该 token 的持续时间等,但将其附加到 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
请记住,基于表单的身份验证仅意味着(简而言之)您将为用户提供某种使用某种表单进行登录的方式。
关于asp.net-mvc - 使用 Controller 的单页应用程序 - 如何使用 ASP.NET Identity 保证安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19869701/