使用FluentSecurity加密ASP.NET MVC

翻译 2016年11月18日 11:11:18

本文总结如何使用FluentSecurity加密ASP.NET MVC


完整教程:https://blog.mariusschulz.com/2011/12/05/securing-an-aspnet-mvc-application-using-fluentsecurity

github: https://github.com/kristofferahl/FluentSecurity


使用FluentSecurity加密MVC应用程序


FluentSecurity优点:

1  授权规则可以用于controller或者单个action 方法

2  Security中心化实施,所以可维护性强;[Authorize]属性也就不再必要

4  可以扩展类库,实施自己的授权规则和违反处理;

5  security configuration是可以单元测试的;允许测试是否正常工作;


使用方法

1 安装方法?

install-package FluentSecurity


2 如何获取用户授权状态?

2.1 打开Global.asax

2.2 添加引用 using FluentSecurity;

2.3 FilterConfig.cs文件,RegisterGlobalFilters(GlobalFilterCollection filters)方法体中添加如下代码:

filters.Add(new HandleSecurityAttribute(), 0);

设置属性过滤器的运行顺序为0是很重要的,这样能确保安全规则管道优先执行;

2.4  Application_Start方法体中,RegisterGlobalFilters ()前,添加security configuration(如下代码)

SecurityConfigurator.Configure(configuration =>
{
    // Tell FluentSecurity where to obtain the user authentication status from
    configuration.GetAuthenticationStatusFrom(() =>
        HttpContext.Current.User.Identity.IsAuthenticated);
});


如果现在运行程序,会得到一个ConfigurationErrorsException 。因为默认情况下:FluentSecurity 会抛出异常,当没有security 显示制定的时候。如果希望关闭此特性,需要制定如下代码:

configuration.IgnoreMissingConfiguration();



3 如何制定特殊的安全政策?

目前,我们配置了authentication 信息,但是还没指定任何authorization 规则;FluentSecurity 使用Policy来配置规则;


举例:

3.1 为了防止HomeController的未授权访问,应该在 SecurityConfig.cs文件下添加如下代码

configuration.For<HomeController>().DenyAnonymousAccess();

现在,如果有未授权用户尝试访问HomeController,会得到PolicyViolationException


3.2如何给所有的Controller加上相同政策?

SecurityConfig.cs文件下加入如下代码:

// Secure all action methods of all controllers
configuration.ForAllControllers().DenyAnonymousAccess();
 
// Make sure that users can still log on
configuration.For<AccountController>(ac => ac.LogOn()).Ignore();

注意:以上代码中,ac => ac.LogOn() 限制了IgnorePolicy 政策应用于LogOn方法。


1.4版本中,如下政策可用

DelegatePolicy — The specified delegate must return true or a success result.

DenyAnonymousAccessPolicy — The user must be authenticated.

DenyAuthenticatedAccessPolicy — The user must be anonymous.

IgnorePolicy — All users are allowed.

RequireAllRolesPolicy — The user must be authenticated with all of the specified roles.

RequireRolePolicy — The user must be authenticated with at least one of the specified roles.



4 如何实施自定义Policy?

4.1 如下代码:

public class WeekendsOnlyPolicy : ISecurityPolicy
{
    public PolicyResult Enforce(ISecurityContext context)
    {
        DateTime now = DateTime.Now;
        bool isWeekend = now.DayOfWeek == DayOfWeek.Saturday
            || now.DayOfWeek == DayOfWeek.Sunday;

        return isWeekend
            ? PolicyResult.CreateSuccessResult(this)
            : PolicyResult.CreateFailureResult(this, "Access denied!");
    }
}



5  如何处理Policy违反?

违反policy时,FluentSecurity 会抛出PolicyViolationException异常。  开发人员可以捕获异常并且做对应处理。 建议符合以下原则:

5.1 必须实现IPolicyViolationHandler接口,一个handle method, 这个方法接受PolicyViolationException 异常,同时返回ActionResult。


5.2 handler的明明必须符合格式:<PolicyName>ViolationHandler,因为FluentSecurity 使用命名来定位handler


综上,推荐使用IOC container来注册 custom policy violation handlers。

更多信息参考:https://github.com/kristofferahl/FluentSecurity/wiki/Policy-violation-handlers



6 测试security 配置

6.1 如何安装?

install-package FluentSecurity.TestHelper



6.2 范例代码

// Arrange
Bootstrapper.ConfigureFluentSecurity();
 
// Act
var results = SecurityConfiguration.Current.Verify(expectations =>
{
    expectations.Expect<HomeController>().Has<DenyAnonymousAccessPolicy>();
    expectations.Expect<AccountController>().Has<DenyAnonymousAccessPolicy>();
    expectations.Expect<AccountController>(ac => ac.LogOn()).Has<IgnorePolicy>();
});
 
// Assert
bool isValidConfiguration = results.Valid();
Assert.IsTrue(isValidConfiguration);



在ASP.NET MVC环境中使用加密与解密

在.NET Framework 4.5的NET框架中,在程序中加密与解密很方便。现在均学习ASP.NET MVC程序了,因此Insus.NET也在此写个学习的例子。在需要时可以参考与查阅。 写一...
  • linybo
  • linybo
  • 2015年03月27日 14:06
  • 1513

ASP.NET MVC中使用JS实现不对称加密密码传输

ASP.NET MVC中登录页面中点击登录后,用户名、密码将被明文传输到Controller中,使用Fiddler等工具可以轻松截获并获取密码, 这是不安全的。 使用对称加密,如AES,密钥将被暴露前...

构建ASP.NET MVC5+EF6+EasyUI 1.5+Unity4.x注入的后台管理系统(62)-EF链接串加密

系列目录 前言:   这一节提供一个简单的功能,这个功能看似简单,找了一下没找到EF链接数据库串的加密帮助文档,只能自己写了,这样也更加符合自己的加密要求 有时候我们发布程序为了避免程序...
  • ymnets
  • ymnets
  • 2016年09月03日 18:39
  • 1494

ASP.NET MVC5+EF6+EasyUI 后台管理系统(62)-EF链接串加密

系列目录 前言:   这一节提供一个简单的功能,这个功能看似简单,找了一下没找到EF链接数据库串的加密帮助文档,只能自己写了,这样也更加符合自己的加密要求 有时候我们发布程序为了避免程序...
  • ymnets
  • ymnets
  • 2017年11月29日 08:42
  • 8

ASP.NET MVC 网站优化总结 使用 Gzip 压缩

1.开GZIP有什么好处? 答:Gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,这样就会减小通过网络传输的数据量,提高浏览的速度。  2.如何启用IIS的Gzip压缩功能: 答...

ASP.NET MVC 常用控件的使用方法总结

1:action 重定向       (a).

asp.net MVC _LayOut布局以及用户控件的使用

1.母板页_Layout.cshtml 类似于传统WebForm中的.master文件,起到页面整体框架重用的目地 1.母板页代码预览 1 DOCTYPE html> 2 html>...

在ASP.NET MVC中简单使用跨域Ajax

什么是跨域Ajax,我们都知道Ajax,可以用服务器进行少量数据交互的技术。所谓跨域,简单的理解,就是跨越域名去访问,当你的网站要访问别人网站数据的时候,就必须使用跨域Ajax。 言归正传,首先来看客...

Asp.net MVC4 使用EF实现数据库的增删改查

EF的使用 步骤: (1)将EF添加到项目:在Model右击添加新建项 找到ADO.NET实体数据模型,接着。。。 (2)实现数据库的增删改查 查询 (因为在Model中已经添...
  • lzz360
  • lzz360
  • 2013年09月21日 15:11
  • 49619

ASP.NET MVC使用jQuery来POST数据至数据库中

学习ASP.NET MVC程序,结合jQuery客户端代码,Post数据至数据库去。Insus.NET今天写一个完整性的例子。 在数据库中,创建一个表[dbo].[TestUser]: ...
  • linybo
  • linybo
  • 2015年03月27日 10:11
  • 846
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用FluentSecurity加密ASP.NET MVC
举报原因:
原因补充:

(最多只允许输入30个字)