为什么Hangfire需要身份验证才能查看仪表板

时间:2015-04-04 01:00:06

标签: asp.net-mvc forms-authentication hangfire

我在我的MVC网络应用中运行HangFire,但每当我尝试导航到http://MyApp/hangfire时,它都会将我重定向到我应用的登录页面,就好像我没有登录一样。

我没有明确配置任何授权要求......例如。我在web.config中有以下内容,但后来试图让它工作。

<location path="hangfire">
<system.web>
  <authorization>
    <allow roles="Administrator" />
    <deny users="*" />  
  </authorization>
</system.web>

理论上,这就是我想要的,当我登录我的主Web应用程序时,我将以Administrator角色登录,因此该规则应该有效。

但是,无论我是否在web.config中配置了该配置,每当我尝试导航到http://MyApp/hangfire时,它都会将我重定向到我在web.config中配置的应用登录页面:

<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="960" />
</authentication>

当我发布到我的主机时,它不会在我的本地计算机上执行此操作。 HangFire是否无法识别我的主应用程序在登录时提供的身份验证Cookie?我一般认为,hangfire应用程序不需要身份验证,那么其他配置可能会认为它有什么作用?

更新1:

我根据hangfire docs添加了授权过滤器,但同样的事情发生了。这是我在Startup.cs中的代码:

using Hangfire;
using Hangfire.Logging;
using Hangfire.Dashboard;
using Hangfire.SqlServer;
using Microsoft.Owin;
using OTIS.Web.AppCode;
using OTISScheduler.AppServ;
using Owin;
using System.Web.Security;

[assembly: OwinStartup(typeof(OTIS.Web.App_Start.Startup))]
namespace OTIS.Web.App_Start
{
    public class Startup
    {
        public void Configuration(IAppBuilder app) {

            app.UseHangfire(config => {
                config.UseSqlServerStorage("DefaultConnection");
                config.UseServer();

                //Dashboard authorization
                config.UseAuthorizationFilters(new AuthorizationFilter
                {
                    Users = "USERA", // allow only specified users (comma delimited list)
                    Roles = "Account Administrator, Administrator" // allow only specified roles(comma delimited list)
                });


            });

            LogProvider.SetCurrentLogProvider(new StubLogProviderForHangfire());

            GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { Attempts = 0 });

            var scheduleTasksInitializer = new ScheduleTasksInitializer();

            scheduleTasksInitializer.ScheduleTasks();
        }
    }
}

更新2:

根据更多detailed instructions showing basic authentication,我也试过了......仍然没有运气......将我转到我应用的登录页面。

config.UseAuthorizationFilters(
new BasicAuthAuthorizationFilter(
    new BasicAuthAuthorizationFilterOptions
    {
        // Require secure connection for dashboard
        RequireSsl = false,
        SslRedirect = false,

        // Case sensitive login checking
        LoginCaseSensitive = true,

        // Users
        Users = new[]
        {
            new BasicAuthAuthorizationUser
            {
                Login = "MyLogin",

                // Password as plain text
                PasswordClear = "MyPwd"
            }
        }
    }));          

3 个答案:

答案 0 :(得分:24)

使用较新版本时,您应使用IDashboardAuthorizationFilter。使用using语句,它将如下所示:

using System.Web;
using Hangfire.Annotations;
using Hangfire.Dashboard;

namespace Scheduler.Hangfire
{
    public class HangFireAuthorizationFilter : IDashboardAuthorizationFilter
    {
        public bool Authorize([NotNull] DashboardContext context)
        {
            //can add some more logic here...
            return HttpContext.Current.User.Identity.IsAuthenticated;
        }
    }
}

然后在配置部分:

app.UseHangfireDashboard("/jobs", new DashboardOptions() 
      {
          Authorization = new [] {new HangFireAuthorizationFilter()}
      });

答案 1 :(得分:11)

终于搞定了。我创建了自己的AuthorizationFilter类(见下文)。 然后我将它传递给Startup.cs配置方法中的MapHangfireDashboard方法(见下文)

public class HangFireAuthorizationFilter : IAuthorizationFilter
{
    public bool Authorize(IDictionary<string, object> owinEnvironment)
    {
        bool boolAuthorizeCurrentUserToAccessHangFireDashboard = false;

        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {
            if(HttpContext.Current.User.IsInRole("Account Administrator"))
                boolAuthorizeCurrentUserToAccessHangFireDashboard = true;
        }

        return boolAuthorizeCurrentUserToAccessHangFireDashboard;
    }
}

将hangfire映射到自定义网址并指定要使用的AuthorizationFilter:

public void Configuration(IAppBuilder app) {

    //Get from web.config to determine to fire up hangfire scheduler or not

    app.UseHangfire(config => {
        config.UseSqlServerStorage("DefaultConnection");
        config.UseServer();              
    });

    //map hangfire to a url and specify the authorization filter to use to allow access
    app.MapHangfireDashboard("/Admin/jobs", new[] { new HangFireAuthorizationFilter() });

}

答案 2 :(得分:1)

按照设计我相信。
请参阅docs for the dashboard

  

默认情况下,Hangfire仅允许访问本地请求的Dashboard页面。

奇怪的是,我前几天正在处理这个问题,需要注意的一件事是,如果你使用Autofac依赖注入,那么你需要确保以正确的顺序配置项目。特别是其他身份验证后的Hangfire ,但在我的情况下,{/ 3}} 之前其他OAuth内容。
经历了相当多的尝试和错误。