2015-04-04 13 views
8

Ich betreibe HangFire in meiner MVC Web-App, aber wenn ich zu http://MyApp/hangfire zu navigieren versuchen, es leitet mich auf meine App-Login-Seite, als ob ich nicht angemeldet bin.Warum ist erforderlich Hangfire Authentifizierung Armaturenbrett

I keine Voraussetzungen für die Autorisierung explizit konfiguriert haben ... z Ich hatte das unten in der web.config, habe es dann aber aus versucht, um das zum laufen zu bringen.

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

In der Theorie ist das, was ich wollen würde, und wenn ich in meine Haupt-Web-Anwendung anmelden, werde ich mit einer Administrator Rolle angemeldet werden, so sollte diese Regel arbeiten.

Aber ob ich das in der web.config konfiguriert oder nicht, wenn ich zu http://MyApp/hangfire zu navigieren versuchen, es mir meine apps umleitet Login-Seite, wie in der web.config konfiguriert:

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

Es tut dies nicht auf meinem lokalen Rechner, nur wenn ich es auf meinem Host veröffentliche. Erkennt HangFire nicht den Authentifizierungscookie, den meine Haupt-App bei der Anmeldung bereitstellt? Ich dachte im Allgemeinen, die Hangfire App benötigt keine Authentifizierung, also welche andere Konfiguration könnte das denken?

UPDATE 1:

habe ich die Berechtigungs Filter pro der hangfire docs, aber das gleiche passiert. Hier ist mein Code 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 die mehr detailed instructions showing basic authentication, ich habe auch versucht, dieses ... noch keine luck..redirects mich zu meiner App-Login-Seite.

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

Antwort

1

Wie entworfen, glaube ich.
Siehe docs for the dashboard.

Standardmäßig erlaubt Hangfire den Zugriff auf Dashboard-Seiten nur für lokale Anfragen.

Merkwürdigerweise war ich mit diesem anderen Tag zu tun und eine Sache von ist sich bewusst sein, dass, wenn Sie Autofac Dependency Injection verwenden, dann müssen Sie sicherstellen, dass Sie Elemente in der richtigen Reihenfolge zu konfigurieren. Speziell Hangfire nach andere Authentifizierung aber auch in meinem Fall MembershipRebootvor die anderen OAuth Zeug.
Nahm ein bisschen Versuch und Irrtum.

+0

Danke für den Input, aber ich habe diesen Code in und nach wie vor das gleiche Ergebnis. Ich verwende nicht Autofac oder OAuth ... nur grundlegende asp.net Grundmitgliedschaft. Irgendwelche anderen Ideen? –

+0

Um alle Dokumente für das Dashboard nicht im Moment arbeiten, hoffe, dass das nur Temp Problem ist. Könnten Sie bitte den Link aktualisieren? – cpoDesign

8

Endlich hat es funktioniert. Ich habe meine eigene AuthorizationFilter-Klasse erstellt (siehe unten). Dann habe ich das an die MapHangfireDashboard-Methode im Startup übergeben.cs-Konfigurationsmethode (siehe unten, dass)

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

Um hangfire zu einem benutzerdefinierten URL-Zuordnung und die AuthorizationFilter angeben zu verwenden:

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

Siehe @Baris Gomleksizoglu Antwort für neuere Version –

17

Bei den neueren Versionen, die Sie IDashboardAuthorizationFilter verwenden sollten. Mit den unter Verwendung von Aussagen, wird es wie folgt aussehen:

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

dann im Konfigurationsabschnitt:

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

Kennen Sie eine Möglichkeit, auf eine Seite umleiten, wenn Benutzer nicht authentifiziert ist. Ie. zu einer Login-Seite? – MartinM

+0

Sie können dies mit der standardmäßigen .NET-Formularauthentifizierung erreichen: Fügen Sie web.config das Tag "authentication" hinzu und überprüfen Sie den angemeldeten Benutzer innerhalb von global.asax in "FormsAuthentication_OnAuthenticate". – Baris

Verwandte Themen