3

按照 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 视图中进行用户身份验证,那也很棒。

提前致谢

4

1 回答 1

2

一种解决方法是将您的 SPA 控制器设置为默认控制器。这些方面的东西:

System.Web.Routing.RouteTable.Routes.MapRoute(
          name: "SPA",
          url: "{controller}/{action}/{id}",
          defaults: new
          {
              controller = "SPA",
              action = "Index",
              id = UrlParameter.Optional
          }
      );

确保它是第一个被映射的 MVC 路由。

然后... 在您的 web.config 中,您可以将 loginUrl 设置为 Landing Controller。

<authentication mode="Forms">
  <forms loginUrl="~/Home/Index" timeout="2880" />
</authentication>

然后.. 使用 Authorize 属性装饰您的 SPA 控制器。对 SPA 控制器的所有未经身份验证的请求都将被重定向到 loginUrl,它指向您的登陆控制器

于 2013-06-12T12:28:14.997 回答