Asp.net AngularJs+的安全性;ServiceStack应用程序
我有一个前端有四个模块的应用程序,我正在尝试在前端使用尽可能多的AngularJs我正在使用一个空的网站asp.net项目来托管所有文件和其余的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
~/ (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支持、路由过滤器等,但目前基本身份验证仍在工作,这正是我试图解决的问题。