在SignalR集线器,Windows身份验证中的Authorize属性的意外行为

时间:2014-09-11 14:18:33

标签: signalr authorize-attribute

我对SignalR有一个非常奇怪的问题,我不知道如何处理它。

我在VB.NET中从教程(http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-getting-started-with-signalr-20)创建了一个简单的SignalR应用程序,我唯一改变的是我将<Authorize()>属性添加到Hub类,并使Send消息方法获取来自上下文的用户名。

我们有开发服务器(Windows Server 2008 R2,IIS7,.NET 4.5.1。)。 在开发服务器中,在IIS和应用程序设置中,我启用了Windows身份验证和ASP.NET模拟。该应用程序正常工作。

现在,当我将这个简单的应用程序部署到我们的生产服务器时,应用程序根本不起作用。操作系统和.NET版本是相同的,我要求我们的管理员以与开发中完全相同的方式配置IIS和应用程序设置。 当我在Chrome中打开index.html时,我在JS控制台中看到ERR_INVALID_AUTH_CREDENTIALS,并且FF Firebug给出了401 Unauthorized错误。当然,集线器方法不起作用。

如果我从Hub中删除<Authorize()>属性并重新编译应用程序,它在dev和prod中都有效,但在这种情况下,用户名在Context中为空。因此,问题肯定存在于授权或身份验证中。

我们在生产服务器中还有其他一些使用Windows身份验证的应用程序,但我们从来没有遇到任何问题。

服务器/ IIS的哪些设置可能会导致这样的问题?

1 个答案:

答案 0 :(得分:3)

我不确定我们是否有完全相同的问题,但我认为其他人可能会在寻找问题的解决方案时找到你的问题。

我的问题是[Authorize]属性在我的MVC控制器中运行良好,但同名的属性,不同的命名空间在我的集线器中不起作用。我一直看到Context.User为空,并且尝试连接到我的集线器的客户端收到了401条未经授权的消息。

我花了一个多小时看了几个小时试图找出导致我问题的原因,我终于明白了。

[assembly: OwinStartup(typeof(Startup))]

namespace Your.Namespace
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {  
            ConfigureAuth(app);
            ConfigureSignalR(app);
        }
    }
}

现在我很明显你应该在 ConfigureSignalR之前配置ConfigureAuth ,但在入门指南中它不够明确。我把他们弄错了。

希望这有助于某人!