2017-08-05 1 views
9

ich viele Einträge in meinen Logs aus dieser Anfrage zu sehen:SignalR/verhandeln macht Anfragen/Konto/Login - Ich habe kein Konto/Login Endpunkt

/signalr/negotiate 

Der Fehler ist:

The controller for path '/Account/Login' was not found or does not implement IController 

ich habe einen Klienten JS zu einer AppHub verbindet, der eine Authentifizierung erfordert:

[Authorize] 
[HubName("appHub")] 
public class AppHub : Hub 
{ 
    // content 
} 

Dies ist Happe ning, weil es eine 'signor'-Sitzung mit einem abgelaufenen Cookie gibt, der versucht, eine Verbindung herzustellen:

  • Ich bin mir nicht sicher, warum die Anfrage automatisch diese Seite sucht. Es ist nirgendwo in meiner web.config, Routen oder anderswo angegeben. Warum passiert dies?
  • Ich möchte verhindern, dass der signalR-Client versucht, eine Verbindung herzustellen, wenn der Benutzer nicht authentifiziert ist. Wie kann dies erreicht werden?
+0

sieht aus wie eine Umleitung durch fehlgeschlagene Autorisierung – Pawel

+0

@Pawel ist es, ja. – SB2055

Antwort

4

Wenn ich verstehe Ihre Frage richtig dann können Sie Ihre eigene benutzerdefinierte Klasse gehen zu wollen, schaffen, dies zu umgehen, indem die AuthorizeAttribute Klasse erben: https://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx

Zum Beispiel:

public class MyCustAuthorize : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.Result = new HttpUnauthorizedResult(); 
     } 
     else 
     { 
      //modify this to do whatever you want to happen if unauthorized 
      filterContext.Result = new RedirectResult("/session/noaccess/"); 
     } 

    } 

} 

Dann können Sie dekorieren es mit Ihrer benutzerdefinierten Klasse anstelle der Standardautorisierung (Beispiel ist von einem MVC-Controller, aber sollte in der Lage sein, die gleiche auf Ihrem Hub zu funktionieren) So das:

[Authorize] 
public class AdminController : Controller 
{ 

dies zu:

[MyCustAuthorize] 
public class AdminController : Controller 
{ 

ich das/Konto/Login glauben ist der Standardpfad für Formulare Auth damit ist, warum es dort leitet, wenn es nicht in der Konfigurationsdatei definiert ist.

Alternativ können Sie die spezifische URL einfügen, um zu umleiten, wenn das ist, was Sie suchen, indem Sie den folgenden loginUrl Attributwert in Ihrem Abschnitt auth> bildet Element in der web.config:

1

Es sieht aus wie dies bereits auf die Fragen zu diesen anderen Antworten ähnlich sein kann, hier gefragt und diese können Ihre Lösung bieten:

Stackoverflow 1

Stackoverflow 2

Haben Sie die Verbindung versucht zu stoppen in der Kunde, wenn er nicht mehr berechtigt ist?

$.connection.hub.stop(); 
+0

Ich habe [Authorize] auf meinem gesamten Hub (siehe Frage). Der Benutzer wird nicht authentifiziert, und der signalR-Client versucht weiterhin, die Verbindung wiederherzustellen, was zu einer Menge von Anfragen an "Account/Login" führt. Ich versuche, diese Anfragen zu verhindern. – SB2055

+0

Der Client sollte anhalten, wenn er sich innerhalb eines Zeitlimits für die erneute Verbindung nicht erneut verbinden kann. – Pawel

0

Ihre Anwendung wird mit FormsAuthentication, so das Authorize Attribut auf die Login-Seite ist standardmäßig Umleiten, wenn es um eine Autorisierung fehlschlägt.

Sie können diese zu Ihrem web.config, indem Sie folgende deaktivieren:

<modules runAllManagedModulesForAllRequests="true"> 
    <remove name="FormsAuthentication" /> 
</modules> 

Dadurch werden alle Verhaltensweisen Standard entfernen.

Sie könnten etwas in Ihrem app.config haben, die wie

<membership defaultProvider="ClientAuthenticationMembershipProvider"> 
    <providers> 
    <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" /> 
    </providers> 
</membership> 

sieht das ist, was für Sie, diese Standardverhalten ist hinzugefügt wird.

Verwandte Themen