20

MVC Web アプリ内で 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:

基本認証を示すより詳細な手順に従って、これも試しました...まだ運がありません..アプリのログインページにリダイレクトされます。

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"
            }
        }
    }));          
4

3 に答える 3

40

新しいバージョンでは、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()}
      });
于 2016-08-11T07:15:19.800 に答える
16

最後にそれが機能しました。独自の AuthorizationFilter クラスを作成しました (以下を参照)。次に、それを Startup.cs Configuration メソッドの 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 をカスタム 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() });

}
于 2015-04-04T23:52:31.580 に答える