关于 hangfire 的权限问题
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 的权限问题的更多相关文章
- hangfire+bootstrap ace 模板实现后台任务管理平台
前言 前端时间刚开始接触Hangfire就翻译了一篇官方的教程[翻译+山寨]Hangfire Highlighter Tutorial,后来在工作中需要实现一个异步和定时执行的任务管理平台,就结合bo ...
- ABP Framework 5.0 RC.1 新特性和变更说明
.Net 6.0 发布之后,ABP Framework 也在第一时间进行了升级,并在一个多星期后(2021-11-16)发布了 5.0 RC.1 ,新功能和重要变更基本已经确定. 5.0版本新特性 新 ...
- ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十四节--后台工作者HangFire与ABP框架Abp.Hangfire及扩展
返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于 ...
- .net framework MVC 下 Hangfire使用,时区,权限
安装 NuGet 上有几个可用的Hangfire 的软件包.如果在ASP.NET应用程序中安装HangFire,并使用Sql Server作为存储器,那么请在Package Manager Conso ...
- Hangfire实战二——为DashBoard页面添加权限认证
概述 Hangfire Dashboard为我们提供了可视化的对后台任务进行管理的界面,我们可以直接在这个页面上对定时任务进行删除.立即执行等操作,如下图所示: 默认情况下,这个页面只能在部署Hang ...
- Hangfire项目实践分享
Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...
- ABP框架理论学习之Hangfire集成
返回总目录 Hangfire是一个综合的后台工作管理者.你可以将Hangfire集成到ABP中,这样就可以不使用默认的后台工作管理者了.但你仍然可以为Hangfire使用相同的后台工作API.这样,你 ...
- ASP.NET ZERO 学习 HangFire的使用
hangfire 是一个分布式后台执行服务. 官网:http://hangfire.io/ 1.启用 hangfire 2.Hangfire可以提供一个面板页面,实时显示所有后台作业的状态,你可以按它 ...
- Hangfire项目实践
Hangfire项目实践分享 Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget ...
随机推荐
- 在java项目中使用log4j的实例
测试log4j的项目结构 Log4j.properties的路径为 src/config/log4j Log4j.properties文件的内容 下面定义日志输出级别是 INFO,并且配置了2个 ...
- Xshell中文乱码问题
1. 先查看当前使用的语言: echo $LANG 2. 查看系统的语言安装包: locale 3. 如果没有中文安装包(包含zh_CN字样),需要网络或者自己上传安装包,安装 4. 有了中文 ...
- linux 文件夹说明,用户添加删除,不熟悉的命令
一.Linux 根目录下的文件夹说明 usr 程序默认安装路径,相当于windows的 program 附显示当前所处位置:pwd 二.用户 用户添加:useradd 用户名 passwd 用户名 u ...
- 袭击Mercurial SCM(HG)
这个叫水银的源代码管理工具尽管默默无闻,但还是得到了非常多团队的使用. 为了迎合某些团队的须要,我们也要用它来管理我们的代码. 今天的任务是先袭击学习.磨刀不误砍柴工. 对工具的掌握越快.工作的效率就 ...
- [SQL SERVER 2005]数据库差异备份及还原
因为之前遇到还原差异备份,最开始遇到SQLServer报错:”无法还原日志备份或差异备份,因为没有文件可用于前滚“.查阅很多资料后,终于得到解决.收集整理成这篇随笔. 问题原因:出现这种错误绝大多数是 ...
- android中的layoutparams参数使用的简单总结
定义: 我们可以在Android的framework中的ViewGroup类里找到定义的类: public static class LayoutParams{...} 此类有如下注释: Layout ...
- nginx lua获取客户端ip
--获取客户端ip function get_client_ip() local headers=ngx.req.get_headers() local ip=headers["X-REAL ...
- 网友对twisted deferr的理解
事實上Deferred的確就像是一連串的動作,用callback的形式被串在一起,我們用deferred或許可以這樣寫 d.addCallback(洗菜)d.addCallback(切菜)d.addC ...
- MySQL数据库之数据类型BOOL/BOOLEAN与TINYINT测试总结
From: http://database.51cto.com/art/201203/323863.htm 网络上很多人咨询mysql是否提供布尔类型?MySQL数据库确实提供布尔类型,此数据类型的关 ...
- POJ 2785 4 Values whose Sum is 0
4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 13069 Accep ...