2015-04-04 15 views
8

Sono in esecuzione HangFire nel mio MVC web app, ma ogni volta che provo a navigare http://MyApp/hangfire, mi reindirizza alla pagina di login di mia app come se io non sono entrato.Perché Hangfire richiedere l'autenticazione per visualizzare dashboard

I non hanno configurato esplicitamente alcun requisito per l'autorizzazione ... es Ho avuto il sotto nel web.config, ma poi l'ho tolto nei tentativi di farlo funzionare.

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

In teoria, questo è quello che avrei voluto, e quando annoto nel mio applicazione Web principale, sarò il login con un ruolo Administrator quindi questa regola dovrebbe funzionare.

Ma se ho configurato che nel web.config o no, ogni volta che provo a navigare verso http://MyApp/hangfire, mi reindirizza ai miei apps pagina di login come configurato nel web.config:

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

E ' NON lo fa sul mio computer locale, solo quando pubblico sul mio host. HangFire non riconosce il cookie di autenticazione che la mia app principale fornisce quando effettuo l'accesso? Ho pensato, in generale, che l'app Hangfire non richieda l'autenticazione, quindi quale altra configurazione potrebbe pensare che funzioni?

UPDATE 1:

ho aggiunto i filtri di autorizzazione per l'hangfire docs, ma la stessa cosa accade. Ecco il mio codice in 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(); 
     } 
    } 
} 

UPDATE 2:

Per più detailed instructions showing basic authentication, ho provato anche questo ... ancora nessun luck..redirects me pagina di login di mia app.

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

risposta

1

Come progettato, credo.
Vedere docs for the dashboard.

Per impostazione predefinita Hangfire consente l'accesso alle pagine del dashboard solo per le richieste locali.

Stranamente avevo a che fare con questo l'altro giorno e una cosa da considerare è che, se si utilizza l'iniezione di dipendenza Autofac quindi è necessario assicurarsi di configurare gli elementi nell'ordine corretto. In particolare Hangfire dopo l' altra autenticazione ma anche, nel mio caso, MembershipRebootprima dello le altre cose di OAuth.
Ci sono voluti un bel po 'di prove ed errori.

+0

Grazie per l'input, ma ho messo che il codice e ancora lo stesso risultato. Non sto usando Autofac o OAuth ... solo l'abbonamento base asp.net basic. Altre idee? –

+0

Per tutti i documenti per dashboard non funzionano al momento, speriamo che sia solo un problema di temperatura. Potresti aggiornare il collegamento? – cpoDesign

8

Finalmente ha funzionato. Ho creato la mia classe AuthorizationFilter (vedi sotto). Quindi l'ho passato al metodo MapHangfireDashboard all'avvio.Metodo di configurazione cs (vedi sotto che)

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

Per mappare hangfire ad un URL personalizzato e specificare l'AuthorizationFilter da usare:

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

} 
+0

Vedere la risposta di @Baris Gomleksizoglu per la versione più recente –

17

Con le versioni più recenti si dovrebbe usare IDashboardAuthorizationFilter. Con le dichiarazioni utilizzando, esso sarà simile a questa:

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

poi nella sezione di configurazione:

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

Conosci un modo per reindirizzare a una pagina quando l'utente non è autenticato. Vale a dire. a una pagina di accesso? – MartinM

+0

Puoi ottenerlo con l'autenticazione standard .net forms: aggiungi il tag "authentication" a web.config e controlla l'utente loggato all'interno di global.asax all'interno di "FormsAuthentication_OnAuthenticate". – Baris

Problemi correlati