将身份验证信息从MVC传递到角度

Jam*_*mey 8 asp.net-mvc angularjs

我的项目使用MVC来提供我的网站的初始标记

MVC控制器非常简单:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在布局视图中有我的ng-app标签,捆绑和@RenderBody:

<!DOCTYPE html>
<html ng-app="myAppName">
<head>
    @Styles.Render("~/Content/css")
</head>
<body>
    <div class="container body-content">
        @RenderBody()
    </div>

    @Scripts.Render("~/bundles/aBundle")
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我的索引视图尽可能简单:

<ng-view></ng-view>
Run Code Online (Sandbox Code Playgroud)

我的angular app.ts文件如下所示:

module app {
    var main = angular.module("myAppName", ["ngRoute", "breeze.angular"]);

    main.config(routeConfig);

    routeConfig.$inject = ["$routeProvider"];
    function routeConfig($routeProvider: ng.route.IRouteProvider): void {
        $routeProvider
            .when("/home",
            {
                templateUrl: "app/views/homeView.html",
                controller: "HomeController as vm"
            })
            .when("/itemDetail/:itemId",
            {
                templateUrl: "app/views/itemDetailView.html",
                controller: "ItemDetailController as vm"
            })
            .when("/addItem",
            {
                templateUrl: "app/views/addItemView.html",
                controller: "AddItemController as vm"
            })
            .when("/login",
            {
                templateUrl: "app/views/loginView.html",
                controller: "LoginController as vm"
            })
            .otherwise("/home");
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以检查用户在MVC控制器中发送的请求,或者在Razor视图中使用@Request.IsAuthenticated查看用户是否已登录,但是将此信息传递给我的角度应用程序的最佳方法是什么可以在用户首次登录时正确地将用户路由到登录页面,但如果他们在服务器上有活动会话,则跳过登录页面?

我尝试解决这个问题的研究告诉我,我可能需要创建一个角度服务来存储关于用户是否经过身份验证的布尔值.然后,我需要添加一些代码来使用$ routeChangeStart检查每个路由的此服务,并仅在必要时重定向到登录页面.我已经看了很多例子,但是在我自己的应用程序的上下文中不能完全把它们放在一起.

有人可以帮我点点滴滴吗?

Fer*_*Bem 0

我正在开发一个不使用剃刀的项目。视图中只有 html 和 Angular。所以...我所做的是:

我创建了一个保存布局的指令“appWrapper”。它里面有一个包含 ng-view 的部分。该指令使用一个控制器 AuthCtrl,该控制器使用一个服务 AuthService。因此,我可以访问整个 html 中该控制器内的所有内容。例如,我可以在侧边栏中的项目中说 ng-click="vm.logout()" 。这个“AuthService”有一些可以被控制器调用的方法。登录和注销是其中两个。当我执行登录时,我使用从控制器返回的一些信息设置了一些 cookie。当我注销时,我会删除这些 cookie。在我的路线所在的 app.js 上,我在最后使用 .run 来在每次位置(url)更改时检查这些 cookie。如果它们存在,它会让用户继续。如果没有,它将用户重定向到登录。

有帮助吗?如果需要,我可以发布代码供您用作示例。

无需在控制器内创建操作来检查这一点。对于用户执行的每个操作,您的应用程序都需要访问服务器、返回浏览器、返回服务器、再返回浏览器。不是很好。