3

我有一个在前端有四个模块的应用程序,我试图在前端使用尽可能多的 AngularJs 我正在使用一个空的网站 asp.net 项目来托管所有文件和 REST serviceStack,我的项目具有以下结构:

~/ (web.config, global.asax and all the out of the box structure for an asp.net website)
- App <-  AngularJs 
    - Users  <-  js controllers and views (static html files)
    - Companies
    - BackEnd
    - Public
    Index.html
    IndexCtrl.js
    App.js
- Content
- Js

我使用 angularjs 服务调用,而后端我使用的是带有 servicestack 的 REST。

问题是我怎样才能限制只有经过身份验证的用户才能访问那些静态 html 文件?假设在公司、后端和用户内部的那些,例如

4

3 回答 3

5

嗨经过一些研究,这是对我有用的解决方案:

  1. 从 nuget安装razor markdown
  2. 更改文件结构以匹配默认行为 RM [Razor Markdown] 到 /views
  3. 按照此服务堆栈示例中描述的方法修改 Web 配置
  4. 将所有静态 htmls 文件更改为 .cshtml 文件,默认情况下,这会创建没有扩展名的相同路由,例如 /views/{Pagename} 没有扩展名,我只是使用这种方法使授权逻辑更易于实现(至少为了我)
  5. 使用授权属性更新服务方法,您可以在此页面中找到更多信息

为了说明一点,这是我到目前为止的路线定义:

'use strict';
angular.module('myApp', ['myApp.directives', 'myApp.services']).config(
    ['$routeProvider', function($routeProvider) {
        $routeProvider.when('/Dashboard', {
            controller: 'dashboardCtrl',
            templateUrl: 'Views/dashboard'
            }).when('/Payments', {
            controller: 'paymentsCtrl',
            templateUrl: 'Views/payments'
        }).
            when('/Login', {
                controller: 'loginCtrl',
                templateUrl: 'Views/login'
            });
    }]

);

请注意,引用现在指向剃刀路径。

这是我用角完成的一个小菜单

<div class="container">

  <div class="navbar" ng-controller="indexCtrl">
    <div class="navbar-inner">
      <a class="brand" href="#/">header menu</a>
      <ul class="nav">
         <li ng-class="{active: routeIs('/Dashboard')}"><a href="#/Dashboard">Dashboard</a></li>
         <li ng-class="{active: routeIs('/Login')}"><a href="#/Login">Login</a></li>
         <li ng-class="{active: routeIs('/Payments')}"><a href="#/Payments">payments</a></li>
      </ul>
    </div>
  </div>


  <ng-view></ng-view>

</div>

假设付款页面受到限制,因此每次单击该页面时都会收到 401 未经授权的消息。

服务主机:

 public override void Configure(Container container)
        { 

            Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] {
                new FacebookAuthProvider(appSettings), 
                new TwitterAuthProvider(appSettings), 
                new BasicAuthProvider(appSettings), 
                new GoogleOpenIdOAuthProvider(appSettings),
                new CredentialsAuthProvider()
            })); //I'm going to support social auth as well.

            Plugins.Add(new RegistrationFeature());

            Routes.Add<UserRequest>("/Api/User/{Id}");
            Routes.Add<LoginRequest>("/Api/User/login","POST");
            Routes.Add<PaymentRequest>("/views/Payments");


        }

我希望这会有所帮助

于 2013-08-05T18:44:43.120 回答
2

创建一个 CatchAllHander 方法来检查受限路由,对于那些需要身份验证的静态文件,如果未通过身份验证,则返回 ForbiddenFileHander,否则返回 null。给定一个 isAuthenticated 方法,并在某处定义了 restrictedDirs - 也许是您的应用程序或 Web 配置文件,它可以很简单:

appHost.CatchAllHandlers.Add((httpMethod, pathInfo, filePath) => {
   if ( restrictedDirs.ContainsKey(pathInfo) && !isAuthenticated())
      return new ForbiddenHttpHandler();
   return null;
}); 
于 2013-08-01T16:24:39.857 回答
0

为什么不使用表单身份验证?只需在您的 web.config 中添加一些 < location > 标签以允许/禁止不同的部分,您甚至可以根据角色进行操作。

于 2013-08-05T07:48:21.403 回答