首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SignalR /negotiate正在向/Account/Login发出请求-我没有Account/Login端点

SignalR /negotiate正在向/Account/Login发出请求-我没有Account/Login端点
EN

Stack Overflow用户
提问于 2017-08-05 15:24:50
回答 3查看 993关注 0票数 9

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

代码语言:javascript
复制
/signalr/negotiate

错误是:

代码语言:javascript
复制
The controller for path '/Account/Login' was not found or does not implement IController

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

代码语言:javascript
复制
[Authorize]
[HubName("appHub")]
public class AppHub : Hub
{
    // content
}

之所以会发生这种情况,是因为存在一个“signalr`”会话,其中有一个过期的cookie试图连接:

  • 我不知道为什么请求会自动查找这个页面。它没有在我的web.config、路由或其他地方指定。为什么会发生这种情况?
  • 如果用户未经身份验证,我希望阻止signalR客户端尝试连接。如何才能做到这一点?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-15 15:04:09

如果我正确地理解了您的问题,那么您将希望通过继承AuthorizeAttribute类:https://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx来创建您自己的自定义类来处理这个问题。

例如:

代码语言:javascript
复制
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控制器,但应该能够在集线器上使用相同的功能),因此如下:

代码语言:javascript
复制
[Authorize]
public class AdminController : Controller
{

变成这样:

代码语言:javascript
复制
[MyCustAuthorize]
public class AdminController : Controller
{

我相信/Account/Login是forms auth的默认路径,所以如果没有在您的配置文件中定义它,它就会指向那里。

或者,您可以插入要重定向到的特定url,如果这是您要搜索的内容,方法是将以下loginUrl属性值放在web.config中的auth节> forms元素中:

票数 4
EN

Stack Overflow用户

发布于 2017-08-09 17:41:45

看起来,这可能类似于这里已经提出的问题的其他答案,这些可能提供您的解决方案:

Stackoverflow 1

Stackoverflow 2

当客户端不再被授权时,您是否尝试停止客户端中的连接?

代码语言:javascript
复制
 $.connection.hub.stop();
票数 1
EN

Stack Overflow用户

发布于 2017-08-11 14:51:02

您的应用程序正在使用FormsAuthentication,因此默认情况下,Authorize属性将重定向到登录页面,当它无法授权时。

可以通过将以下内容添加到web.config中来禁用此功能:

代码语言:javascript
复制
<modules runAllManagedModulesForAllRequests="true">
  <remove name="FormsAuthentication" />
</modules>

这将删除所有默认行为。

您的app.config中可能有一些看起来像

代码语言:javascript
复制
<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>

这就是为您添加这些默认行为的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45523537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档