好的,所以我已经和SignalR玩了一段时间了。我有一个包含以下项目的VS2013解决方案:
这些文件在本地运行时,将使用hosts文件转发域。它们在不同的域上运行,因为我希望SignalR与任何其他项目完全独立运行(因为某些桌面软件(可能还有一个iOS应用程序)也可以访问SignalR)。
在Mvc网站上,正在运行一个小留言板。包括留言板的整个网站都位于表单auth的后面。我使用Javascript通过GetMessages
自定义函数调用信号,通过SignalR检索了板子上的所有消息MessageHub
:
$(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属性(或通过config强制对所有集线器进行身份验证)对我来说是众所周知的,我的问题是有关身份验证部分的。
那么如何正确进行身份验证?我相信,只要我们在不同的域上,共享cookie就不会起作用(有人可以确认吗?)。为此,我需要以某种方式使用Mvc网站中创建的Cookie(我猜是?)来使用,但是我不知道如何将其发送到SignalR以及将其与之进行比较?还是将用户名和密码发送到SignalR,然后在业务层中针对成员资格提供程序进行身份验证?实现此目标的最佳模式是什么?任何想法将不胜感激。
最终,我通过查看一些用于表单身份验证的单点登录技术的示例找到了解决方案。基本上我所做的是:
将以下内容添加到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为true。
最终我加了
GlobalHost.HubPipeline.RequireAuthentication();
在SignalR Startup类中,以确保只有经过身份验证的用户才能访问任何集线器。登录之前,尝试进入集线器时,我现在收到401未经授权。登录后,由与SignalR共享的mvc网站创建cookie,并且可以访问集线器。像魅力一样工作,比我预期的简单得多!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句