按照John Papa的课程,我正在建立一个SPA,并试图确保用户只有在Facebook / Google +身份验证后才能进入SPA。为此,我有两个MCV控制器,默认和着陆控制器称为Home / Index,这只显示带有FB / G +登录按钮的介绍屏幕。一旦使用,单击其中一个按钮并验证用户然后被带到第二个控制器,该控制器是实际的SPA页面,并且div具有id = applicationHost以及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')
路由器正在寻找整个应用程序根目录中的快照路由
它尝试加载的网址就像'localhost:XXXX / Home / #'
结果我从Sammy那里得到了404错误。
当我手动加载转到'localhost:XXXX / SPA / Snaps /#时,我的视图没有问题。
如何让路由器在SPA MVC控制器而不是'Home'控制器中查找路由'snap'和'place'。
所有这些我只是为了确保在让他们进入SPA之前让人们通过身份验证,所以如果有一种方法可以在其中一个SPA视图中进行身份验证,那么我基本上避免了这个问题。如果上面的问题没有答案,至少如果有人可以说明如何在SPA视图中进行用户身份验证,那也很好。
提前致谢
答案 0 :(得分: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,loginUrl指向您的Landing Controller