hangfire 是一个分布式后台执行服务。

官网:http://hangfire.io/

我看中hangfire的地方是

1:使用简单

2:多种持久化保存方案。支持sqlserver ,msmq等 ,其他的redis 等持久化方案要收费。不过自己扩展不是难事。hangfire基于net3.5的extension扩展。

3:有监控系统,并且可以和其他监控系统集成。

回顾正题:

hangfire在部署到iis环境上,通过地址访问的时候会出现401未授权错误。通过代码分析是由于hangfire内建授权机制造成的问题。

在分析源码前,建议先对owin做个了解:

http://www.cnblogs.com/dudu/p/what-is-owin.html

http://owin.org/

hangfire继承了OwinMiddleware,在每次请求的时候会去执行IAuthorizationFilter的实现。

   internal class DashboardMiddleware : OwinMiddleware
{
private readonly JobStorage _storage;
private readonly RouteCollection _routes;
private readonly IEnumerable<IAuthorizationFilter> _authorizationFilters; public override Task Invoke(IOwinContext context)
{
var dispatcher = _routes.FindDispatcher(context.Request.Path.Value); if (dispatcher == null)
{
return Next.Invoke(context);
} foreach (var filter in _authorizationFilters)
{
if (!filter.Authorize(context.Environment))
{
context.Response.StatusCode = (int) HttpStatusCode.Unauthorized;
return Task.FromResult(false);
}
} var dispatcherContext = new RequestDispatcherContext(
_storage,
context.Environment,
dispatcher.Item2); return dispatcher.Item1.Dispatch(dispatcherContext);
}
}

hangfire默认加载了 LocalRequestsOnlyAuthorizationFilter

    public class LocalRequestsOnlyAuthorizationFilter : IAuthorizationFilter
{
public bool Authorize(IDictionary<string, object> owinEnvironment)
{
var context = new OwinContext(owinEnvironment);
var remoteAddress = context.Request.RemoteIpAddress; // if unknown, assume not local
if (String.IsNullOrEmpty(remoteAddress))
return false; // check if localhost
if (remoteAddress == "127.0.0.1" || remoteAddress == "::1")
return true; // compare with local address
if (remoteAddress == context.Request.LocalIpAddress)
return true; return false;
}
}

可以看出来对remoteaddress做了限制。

如果不考虑安全的场合,可以采用以下做法:

    public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseHangfire(config =>
{
config.UseAuthorizationFilters(new DontUseThisAuthorizationFilter()); config
.UseSqlServerStorage(@"server=xxxxx;database=Hangfire;uid=sa;pwd=123.com")
.UseMsmqQueues(@".\Private$\hangfire{0}", "default", "critical");
}); app.MapHangfireDashboard();
}
}
    public class DontUseThisAuthorizationFilter : IAuthorizationFilter
{
public bool Authorize(IDictionary<string, object> owinEnvironment)
{
return true;
}
}
 

如果需要结合现有系统权限机制的场合,也是实现IAuthorizationFilter:

 GlobalContext.Current.UserInfo是我们系统内部的一个上下文class。
    public class CustomAuthorizationFilter : IAuthorizationFilter
{
public bool Authorize(IDictionary<string, object> owinEnvironment)
{
var context = new OwinContext(owinEnvironment);
if ( GlobalContext.Current.UserInfo==null){
string urls = "/Index/Login?url=" + context.Request.Uri.Host;
context.Response.Redirect(urls);
return false;
}
return true;
}
}

关于 hangfire 的权限问题的更多相关文章

  1. hangfire+bootstrap ace 模板实现后台任务管理平台

    前言 前端时间刚开始接触Hangfire就翻译了一篇官方的教程[翻译+山寨]Hangfire Highlighter Tutorial,后来在工作中需要实现一个异步和定时执行的任务管理平台,就结合bo ...

  2. ABP Framework 5.0 RC.1 新特性和变更说明

    .Net 6.0 发布之后,ABP Framework 也在第一时间进行了升级,并在一个多星期后(2021-11-16)发布了 5.0 RC.1 ,新功能和重要变更基本已经确定. 5.0版本新特性 新 ...

  3. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十四节--后台工作者HangFire与ABP框架Abp.Hangfire及扩展

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于 ...

  4. .net framework MVC 下 Hangfire使用,时区,权限

    安装 NuGet 上有几个可用的Hangfire 的软件包.如果在ASP.NET应用程序中安装HangFire,并使用Sql Server作为存储器,那么请在Package Manager Conso ...

  5. Hangfire实战二——为DashBoard页面添加权限认证

    概述 Hangfire Dashboard为我们提供了可视化的对后台任务进行管理的界面,我们可以直接在这个页面上对定时任务进行删除.立即执行等操作,如下图所示: 默认情况下,这个页面只能在部署Hang ...

  6. Hangfire项目实践分享

    Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...

  7. ABP框架理论学习之Hangfire集成

    返回总目录 Hangfire是一个综合的后台工作管理者.你可以将Hangfire集成到ABP中,这样就可以不使用默认的后台工作管理者了.但你仍然可以为Hangfire使用相同的后台工作API.这样,你 ...

  8. ASP.NET ZERO 学习 HangFire的使用

    hangfire 是一个分布式后台执行服务. 官网:http://hangfire.io/ 1.启用 hangfire 2.Hangfire可以提供一个面板页面,实时显示所有后台作业的状态,你可以按它 ...

  9. Hangfire项目实践

    Hangfire项目实践分享 Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget ...

随机推荐

  1. 匿名对象和object的转换

    有时候经常用到需要把一个匿名对象存入session或List<object>或其他容器中,可是取出来的时候变成object了,不太方便使用. 下面是一种转换方式:     class Pr ...

  2. WPF中System.Diagnostics.Process.Start的妙用

    我们经常会遇到在Winform或是WPF中点击链接或按钮打开某个指定的网址, 或者是需要打开电脑中某个指定的硬盘分区及文件夹, 甚至是"控制面板"相关的东西, 那么如何做呢? 答案 ...

  3. Navi.Soft30.产品.格式化.操作手册

    1系统简介 1.1功能简述 在软件开发过程中,我们对字符串操作最多. 尤其是Web开发时,数据交换一般采用JSON或XML.本产品作用是格式化各种常用字符串,目前包括:Json,Xml,Html,Sq ...

  4. ecshop 加广告出现广告位的宽度值必须在1到1024之间

    打开 admin/ad_position.php这个文件,搜索1024,这里你会搜到两个地方 在236行左右 if ($ad_width > 1024 || $ad_width < 1) ...

  5. windows原生开发之界面疑云

        windows桌面开发,界面始终是最大的困惑.我们对前端工具的要求,其实只有窗体设计器.消息映射,过分点的话自适应屏幕.模型绑定.能够免于手工书写,其实这个问题并不复杂,但VS不实现.QT语法 ...

  6. 解决URL路径包含+等特殊符号,编码也无效的办法

    <?xml version="1.0" encoding="UTF-8"?><configuration>      <syste ...

  7. AX ERP 真正的自动批处理

    AX real batch job- AX ERP 真正的批处理 在AX3标准功能中,自动化任务是利用Batch来进行自动化处理任务,标准功能的局限是无法真正做到无人值守.比如服务器重启,必须手动去开 ...

  8. 译:用InnoSetup模块化安装依赖项

    译文出处:http://www.codeproject.com/Articles/20868/NET-Framework-Installer-for-InnoSetup 源文件下载:http://fi ...

  9. 译:C#面向对象的基本概念 (Basic C# OOP Concept) 第二部分(封装,抽象,继承)

    6.封装 封装就是对外部类隐藏成员或变量.我已经说过房子的保安仅仅被限制在房子的入口处,不需要知道屋内发生了什么.房主对保安隐藏了屋内所发生的任何事,以便更安全.隐藏和限制就被称为封装. 例如我们有两 ...

  10. SharePoint 2010中重置windows 活动目录(AD)域用户密码的WebPart(免费下载)

    由于SharePoint 2013推出不久,并非所有的企业都会升级到SharePoint 2013的,毕竟升级不是打打补丁这么简单,更多的企业还是使用Sharepoint 2010版本的,因此本人自行 ...