2017-08-05 123 views
9

我看到許多條目在我的日誌,從這個請求:SignalR /談判正在請求/帳號/登錄 - 我沒有帳戶/登錄端點

/signalr/negotiate 

的錯誤是:

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

我有一個JS客戶端連接到AppHub需要身份驗證:

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

這是Happe的寧,因爲有一個'信號'會話與過期的cookie試圖連接:

  • 我不確定爲什麼請求會自動查找此頁面。它沒有在web.config,路由或其他地方的任何地方指定。這是爲什麼發生?
  • 我想阻止signalR客戶端嘗試連接,如果用戶未經身份驗證。這怎麼能實現?
+0

看起來像是由於授權失敗導致的重定向 – Pawel

+0

@Pawel是的,是的。 – SB2055

回答

4

如果我理解你的問題正確,那麼你會想創建自己的自定義類通過繼承AuthorizeAttribute類來處理這個問題:https://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx

例如:

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

    } 

} 

然後你可以裝飾它與您的自定義類而不是默認授權 (例如是從一個mvc控制器,但應該能夠在您的集線器上相同的功能) 所以這個:

[Authorize] 
public class AdminController : Controller 
{ 

變爲這樣:

[MyCustAuthorize] 
public class AdminController : Controller 
{ 

我相信/帳號/登錄是窗體身份驗證默認路徑,這就是爲什麼它是指導那裏,如果它不是你的配置文件中定義。

另外,您可以插入特定的URL重定向到,如果這是你把下列loginUrl屬性值的權威性部分搜索的內容>在web.config構成元素

1

它看起來像這可能是類似這些問題的答案已經在這裏問這些可以提供您的解決方案:

Stackoverflow 1

Stackoverflow 2

您是否嘗試過停止在連接客戶何時不再被授權?

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

我有[授權]在我的整個樞紐(見問題)。用戶變得沒有身份驗證,並且signalR客戶端繼續嘗試「重新連接」,導致大量請求到「賬戶/登錄」。我試圖阻止這些請求。 – SB2055

+0

如果客戶端在重新連接超時時間內無法重新連接,應該停止。 – Pawel

0

您的應用使用FormsAuthentication,所以Authorize屬性默認情況下,當它沒有授權重定向到登錄頁面。

您可以通過添加以下到你的web.config禁用此:

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

這將刪除所有的默認行爲。

你可能在你的app.config東西,看起來像

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

而這一點正是將這些默認行爲爲您服務。