SignalR / negotiate делает запросы к / Account / Login - у меня нет учетной записи/конечной точки входа

Я вижу много записей в моих журналах из этого запроса:

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

это происходит потому, что есть сеанс "signalr" с истекшим файлом cookie, пытающимся подключиться:

  • Я не уверен, почему запрос автоматически ищет эту страницу. Это не указано нигде в моей сети.конфиг, маршруты или где-то еще. Почему это происходит?
  • Я хотел бы запретить клиенту signalR пытаться подключиться, если пользователь не аутентифицирован. Как этого можно достичь?

3 ответов


Если я правильно понимаю вашу проблему, то вы захотите создать свой собственный класс для обработки этого путем наследования класса 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
{

Я считаю, что /Account / Login-это путь по умолчанию для Forms auth, поэтому он направляет туда, если он не определен в вашем файле конфигурации.

В качестве альтернативы вы можете вставить конкретный url для перенаправления, если это то, что вы ищете, поместив следующее значение атрибута loginUrl в разделе auth > элемент forms в интернете.config:


похоже, что это может быть похоже на эти другие ответы на вопросы, уже заданные здесь, и они могут предоставить ваше решение:

и StackOverflow 1

и StackOverflow 2

вы пытались остановить соединение в клиенте, когда они больше не авторизованы?

 $.connection.hub.stop();

ваше приложение использует FormsAuthentication, поэтому Authorize атрибут перенаправляет на страницу входа в систему по умолчанию, когда он не может авторизоваться.

вы можете отключить это, добавив следующую строку в ваш веб.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>

что и добавляет эти поведения по умолчанию для вас.