SignalR/negotiate向/ Account/Login发出请求 - 我没有帐户/登录端点

SB2*_*055 9 signalr signalr.client

我在这个请求的日志中看到了很多条目:

/signalr/negotiate
Run Code Online (Sandbox Code Playgroud)

错误是:

The controller for path '/Account/Login' was not found or does not implement IController
Run Code Online (Sandbox Code Playgroud)

我有一个连接到AppHub需要身份验证的JS客户端:

[Authorize]
[HubName("appHub")]
public class AppHub : Hub
{
    // content
}
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为有一个'signalr`会话活着,并且过期的cookie尝试连接:

  • 我不确定为什么请求会自动搜索此页面.它没有在我的web.config,路由或其他地方指定.为什么会这样?
  • 如果用户未经身份验证,我想阻止signalR客户端尝试连接.怎么能实现这一目标?

Tra*_*ton 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/");
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

然后你可以用你的自定义类而不是默认的授权来装饰它(示例来自 mvc 控制器,但应该能够在你的集线器上发挥相同的作用)所以这样:

[Authorize]
public class AdminController : Controller
{
Run Code Online (Sandbox Code Playgroud)

就变成这样了:

[MyCustAuthorize]
public class AdminController : Controller
{
Run Code Online (Sandbox Code Playgroud)

我相信 /Account/Login 是表单身份验证的默认路径,因此如果您的配置文件中未定义它,它就会指向那里。

或者,您可以插入要重定向的特定 url(如果您正在搜索该 URL),方法是将以下 loginUrl 属性值放入 web.config 中的 auth 部分 > forms 元素中: