【发布时间】:2013-06-07 19:11:15
【问题描述】:
按照 John Papa 的课程,我正在构建一个 SPA,并尝试确保用户只有在 Facebook/Google+ 身份验证后才能访问 SPA。为此,我有两个 MCV 控制器,默认和着陆控制器称为 Home/Index,它仅显示带有 FB/G+ 登录按钮的介绍性屏幕。使用后,单击其中一个按钮并验证用户身份,然后将其带到第二个控制器,该控制器是实际的 SPA 页面,具有 id=applicationHost 的 div 以及 shell 加载和 SPA 开始的位置。
我正在使用以下路线 JSON 数组来映射我的路线
var routes = [{
url: 'snaps',
moduleId: 'viewmodels/snaps',
name: 'Snaps',
visible: true
},{
url: 'places',
moduleId: 'viewmodels/places',
name: 'Places',
visible: true
}];
但是当我调用 router.map(config.routes) 后跟 router.activate('snaps')
路由器正在整个应用程序的根目录中寻找 snaps 路由
它尝试加载的 url 类似于 'localhost:XXXX/Home/#'
因此,我从 Sammy 收到 404 错误。
当我手动加载时,转到 'localhost:XXXX/SPA/Snaps/# 我的视图没有问题。
如何让路由器在 SPA MVC 控制器而不是“Home”控制器中查找路由“snap”和“place”。
我所做的所有这些只是为了确保在让他们进入 SPA 之前让他们进行身份验证,所以如果有一种方法可以在 SPA 视图本身中进行身份验证,那么我基本上已经避免了这个问题。如果上面的问题没有答案,至少如果有人可以阐明我如何在 SPA 视图中进行用户身份验证,那也很棒。
提前致谢
【问题讨论】:
-
“带到第二个控制器” - 你的意思是整页刷新对吗?恕我直言(因为我已经实现了它)“登录”应该是 SPA 应用程序本身的一部分,因此它是意见之一。几点: 1.) 为登录过程构建 Web API,可通过 ajax 调用。 2.) 用 Authorize 装饰你的控制器类。这样,任何未经授权的调用都不会成功。
-
@alpinescrambler 感谢您的回复,是的,我正在刷新整页,但这只是第一次(在登录期间)。我这样做是因为我不知道如何在 SPA 视图中进行 Facebook 身份验证。您能否详细说明第 1 点。 1 在你评论?您能否详细说明我如何使用 webAPI 进行外部 OAuth。再次感谢。
标签: asp.net-mvc-4 knockout.js single-page-application durandal sammy.js