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