Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net AngularJs+的安全性;ServiceStack应用程序_Asp.net_Security_Angularjs_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack_Angularjs Routing - Fatal编程技术网 servicestack,angularjs-routing,Asp.net,Security,Angularjs,servicestack,Angularjs Routing" /> servicestack,angularjs-routing,Asp.net,Security,Angularjs,servicestack,Angularjs Routing" />

Asp.net AngularJs+的安全性;ServiceStack应用程序

Asp.net AngularJs+的安全性;ServiceStack应用程序,asp.net,security,angularjs,servicestack,angularjs-routing,Asp.net,Security,Angularjs,servicestack,Angularjs Routing,我有一个前端有四个模块的应用程序,我正在尝试在前端使用尽可能多的AngularJs我正在使用一个空的网站asp.net项目来托管所有文件和其余的serviceStack,我的项目有以下结构: ~/ (web.config, global.asax and all the out of the box structure for an asp.net website) - App <- AngularJs - Users <- js controllers and vi

我有一个前端有四个模块的应用程序,我正在尝试在前端使用尽可能多的AngularJs我正在使用一个空的网站asp.net项目来托管所有文件和其余的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
~/(web.config、global.asax和asp.net网站的所有现成结构)

-App创建一个CatchAllHander方法来检查受限路由,对于那些需要身份验证的静态文件,如果未经身份验证,则返回禁止的FileHander,否则返回null。如果某个地方定义了isAuthenticated方法和restrictedDirs(可能是您的应用程序或web配置文件),那么它可以简单到:

appHost.CatchAllHandlers.Add((httpMethod, pathInfo, filePath) => {
   if ( restrictedDirs.ContainsKey(pathInfo) && !isAuthenticated())
      return new ForbiddenHttpHandler();
   return null;
}); 

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

嗨,在做了一些研究之后,这是一个对我有效的解决方案:

  • 从nuget安装
  • 更改文件结构以将默认行为RM[Razor Markdown]与/views匹配
  • 按照中描述的方法修改web配置
  • 将所有静态htmls文件更改为.cshtml文件,这在默认情况下会创建没有扩展名的相同路由,例如/views/{Pagename}没有扩展名,我只是使用这种方法来简化授权逻辑的实现(至少对我来说)
  • 使用authorize属性更新服务方法,您可以了解更多信息
  • 为了进一步说明,这是到目前为止我的路线定义:

    '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>
    
    
    
    假设付款页面受到限制,所以每次我点击页面上的某个按钮时,都会收到一条未经授权的消息

    服务主机:

     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");
    
    
            }
    
    public override void Configure(容器)
    { 
    Add(新AuthFeature(()=>新AuthUserSession(),新IAuthProvider[]{
    新的FacebookAuthProvider(appSettings),
    新TwitterAuthProvider(appSettings),
    新的BasicAuthProvider(应用设置),
    新的GoogleOpenIdOAuthProvider(appSettings),
    新凭据AuthProvider()
    }));//我还将支持社交网站auth。
    Add(newregistrationfeature());
    添加(“/Api/User/{Id}”);
    添加(“/Api/User/login”、“POST”);
    添加(“/视图/付款”);
    }
    

    我希望有帮助

    站点和服务是否都托管在同一个域上?@Malkus是的,它们将位于同一个域中,并且将位于IIS 7By安全中的同一上下文/应用程序池下,你是说你想通过某种身份验证方法限制访问吗?@Johnseng是的,这就是我的意思!谢谢您需要对这些文件/目录进行某种身份验证。也许是http认证。不确定如何在servicestack中执行此操作。我们使用基于cookies的http模块来实现。谢谢@marfarma如果文件是静态htmls会是什么情况?或者如果我正在发送ajax请求?只要ServiceStack服务于文件,而不是httpd服务器(IIS、Apache、Ngnix等),此catchall处理程序就可以工作。您只需根据自己的需求调整条件表达式。有关配置示例,请参见。如果ServiceStack正在为您受保护的静态资产提供服务,那么集成身份验证检查就很容易&无论您的客户机如何请求它们(ajax或不请求),如果请求者未经身份验证,则不会为资产提供服务。如果您没有看到它,这里有一个教程介绍如何向ServiceStack项目添加自定义身份验证:感谢这些非常有用的链接,困难的部分是将所有内容放在一起,但我做了一些工作,并用一种方法更新了文章。@Pendro这是正确的做法。当您使用基于REST的API时,无论是您自己的API还是其他人的API,您的安全性都是基于API提供的cookie的。servicestack也完成了同样的工作。所以,你需要做的大部分事情。和你在这里做的一样。此外,如果您喜欢,也可以移动到https或阻止请求头。如果你想了解更多细节,请告诉我。将尝试提供链接和示例。如果您得到答案,则最好选择“作为答案”并将其关闭。:)@kunjee感谢您的大力帮助,我仍在进行安全方面的工作,我仍需要一步一步地实施ng sanitize-Laravel CSRF支持、路由过滤器等,但目前基本身份验证仍在工作,这正是我试图解决的问题。