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:
похоже, что это может быть похоже на эти другие ответы на вопросы, уже заданные здесь, и они могут предоставить ваше решение:
вы пытались остановить соединение в клиенте, когда они больше не авторизованы?
$.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>
что и добавляет эти поведения по умолчанию для вас.