2017-08-05 120 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> 

而这一点正是将这些默认行为为您服务。