【问题标题】:How to do forms authentication with SignalR (separate domains)?如何使用 SignalR(独立域)进行表单身份验证?
【发布时间】:2014-03-18 06:41:56
【问题描述】:

好的,所以我玩 SignalR 已经有一段时间了。我有一个包含以下项目的 VS2013 解决方案:

  • 业务项目(包含自定义成员资格提供程序的类库)
  • Mvc 网站(本地 IIS - subdomain1.domain.ext)
  • SignalR(本地 IIS - subdomain2.domain.ext)

目前这些在本地运行,域是使用主机文件转发的。它们在不同的域上运行,因为我希望 SignalR 与任何其他项目完全分开运行(因为某些桌面软件也可以访问它,并且可能是 iOS 应用程序)。

在 Mvc 网站中,一个小留言板正在运行。包括留言板在内的整个网站都在表单身份验证后面。我通过 SignalR 检索电路板的所有消息,使用 Javascript 在自定义 MessageHub 上调用 GetMessages 函数:

 $(function () {
        // Declare a proxy to reference the hub.
        var signalrUrl = SignalrBaseUrl + '/signalr';
        var messageList = $('#messageList');
        var messenger = $.connection.messengerHub;

        messenger.client.addMessage = function (message) {
            addMessageToList(message);
        };

        function init() {
            messenger.server.getAllMessages().done(function (messages) {
                messageList.empty();
                addMessagesToList(messages);
        })
    }

    [...]

    // Start the connection.
    $.connection.hub.url = signalrUrl;
    $.connection.hub.logging = SignalrLogging;
    $.connection.hub.start().done(init);
 })

我只希望经过身份验证的用户能够访问集线器,以及所有集线器。我知道设置 Authorize 属性(或通过配置强制对所有集线器进行身份验证),我的问题是关于身份验证部分。

那么如何正确完成身份验证?我相信只要我们在不同的域上共享 cookie 就不会起作用(有人可以确认吗?)。为此,我需要以某种方式使用 Mvc 网站中创建的 Cookie(我猜?)来使用,但我不知道如何将其发送到 SignalR 以及将其与什么进行比较?或者将用户名和密码发送到 SignalR 并在那里针对业务层中的成员资格提供者进行身份验证?实现这一目标的最佳模式是什么?任何想法将不胜感激。

【问题讨论】:

    标签: c# .net forms-authentication signalr


    【解决方案1】:

    最终我通过查看一些用于表单身份验证的单点登录技术示例找到了解决方案。基本上我所做的是:

    将以下内容添加到 MVC 和 SignalR web.config:

    <authentication mode="Forms">
        <forms name="MyCookieName" domain=".domain.nl" cookieless="AutoDetect" loginUrl="My/Login/Url" timeout="525600" />
    </authentication>
    <machineKey validationKey="12345etc" decryptionKey="cte54321" validation="SHA1" decryption="AES" />
    

    两个项目都运行在主域名 domain.nl 下非常重要(例如 subdomain1.domain.com 和 subdomain2.domain.com)。机器密钥用于 cookie 和票证加密,应在两个 web.configs 中设置。 (更多信息:http://www.codeproject.com/Articles/27576/Single-Sign-on-in-ASP-NET-and-Other-Platforms

    在mvc项目中,cookie在登录后照常设置:

    FormsAuthentication.SetAuthCookie(loginName, true);
    

    我使用 chrome 开发者工具检查 cookie 是否设置正确。出于测试目的,我将以下内容放在我的信号集线器中,在 if 语句处放置一个断点:

    if (Context.User.Identity.IsAuthenticated)
    {                
    }
    

    那么 User 不为 null,IsAuthenticated 为真。

    最后我加了

    GlobalHost.HubPipeline.RequireAuthentication();
    

    在我的 SignalR Startup 类中,以确保只有经过身份验证的用户才能访问任何集线器。在登录之前,我现在在尝试访问集线器时收到 401 Not authorized。登录后,由与 SignalR 共享的 mvc 网站创建 cookie,并且可以访问中心。像魅力一样工作,比我预期的要简单得多!

    【讨论】:

    • 应用程序之间的 标签也很匹配
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 2018-07-03
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多