代码之家  ›  专栏  ›  技术社区  ›  Alan

本地IIS服务器上MVC中的Hangfire包回应为“网站拒绝显示此网页”

  •  0
  • Alan  · 技术社区  · 5 年前

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

    我没有明确配置任何授权要求。。。e、 我在网上看到了下面的内容。配置,但为了让它工作,又把它取了出来。

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

    理论上,这就是我想要的,当我登录到我的主web应用程序时,我将使用 Administrator 所以这个规则应该有效。

    但我是否在网络上配置了它。无论是否配置,只要我尝试导航到 http://MyApp/hangfire ,它会将我重定向到web中配置的应用程序登录页面。配置:

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

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

    更新1:

    我根据 hangfire docs ,但同样的事情也发生了。这是我在Startup中的代码。反恐精英:

    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"
                }
            }
        }));          
    
    0 回复  |  直到 9 年前
        1
  •  40
  •   Piotr Kula David Boike    4 年前

    你应该使用更新的版本 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;
    
                //Can use this for NetCore
                return context.GetHttpContext().User.Identity.IsAuthenticated; 
            }
        }
    }
    

    然后在配置部分:

    app.UseHangfireDashboard("/jobs", new DashboardOptions() 
          {
              Authorization = new [] {new HangFireAuthorizationFilter()}
          });
    
        2
  •  16
  •   crichavin    9 年前

    终于成功了。我创建了自己的AuthorizationFilter类(见下文)。 然后我在启动时将其传递给MapHangfireDashboard方法。cs配置方法(见下文)

    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映射到自定义url并指定要使用的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() });
    
    }
    
        3
  •  3
  •   shunty    9 年前

    我相信这是设计好的。
    看到了吗 docs for the dashboard .

    默认情况下,Hangfire只允许本地请求访问仪表板页面。

    奇怪的是,前几天我正在处理这个问题,需要注意的一件事是,如果你正在使用 Autofac 依赖注入然后你需要确保你按照正确的顺序配置项目。特别是绞刑 之后 其他身份验证,但就我而言, MembershipReboot 之前 另一个OAuth的东西。
    经历了相当多的尝试和错误。