我正在尝试使用ServerEvents设置servicestack。我已经为ServerEventsFeature添加了插件。我正在使用Javascript服务器事件客户端,我尝试了一个简单的示例,在用户经过身份验证后在客户端上执行此操作。
var source = new EventSource('http://localhost/ecmapi/event-stream?channel=MyChannel');
$(source).handleServerEvents({
handlers: {
onConnect: function (subscription) {
console.log("connected! welcome " + subscription.displayName);
},
onHeartbeat: function (msg, e) {
//console.log("onHeartbeat", msg, e);
},
showNotification: function (type, e) {
console.log("showNotification", type);
}
}
});
在apphost文件上:
Plugins.Add(new ServerEventsFeature
{
StreamPath = "/event-stream",
HeartbeatPath = "/event-heartbeat",
UnRegisterPath = "/event-unregister",
SubscribersPath = null,
LimitToAuthenticatedUsers = false,
NotifyChannelOfSubscriptions = false
});
要向我正在呼叫的客户端发送事件,请执行以下操作:
ServerEvents.NotifyChannel("MyChannel", "cmd.showNotification", message);
我成功地在客户端上的show通知功能上接收到它。
然而,订阅服务仍然存在。displayName是自动生成的,与当前登录的用户无关。此外,如果我将LimitToAuthenticatedUsers设置为true,则会重新运行401错误。
我的问题是,javascript服务器事件客户端还需要什么才能与已经登录的用户一起工作?我想使用ServerEvents。通知用户名或服务器事件。NotifyUserId函数,并且只允许经过身份验证的用户订阅。
谢谢
**请求的auth和EventSource的请求和响应标头**
请求授权
POSThttp://localhost/ECMAPI/auth.jsonHTTP/1.1接受:/内容类型:应用程序/json X-请求-与:XMLHttp请求参考:http://localhost/InterfaceGov/Default.aspx接受-语言:en-gb接受-编码:gzip,收缩用户代理:Mozilla/5.0(兼容;MSIE 9.0;Windows NT 6.1;WOW64;三叉戟/5.0)主机:localhost内容长度:43连接:保持生存Pragma:无缓存Cookie:_ga=GA1.1.2077781525.1452005918;。ASPXANONYMOUS=hOL_MQPsZk5z5t31805S8oazFP0IdbeHKBejAH2x2Ic6hS5070aWW5A-2dklH10qT8IE9pshiAgUkmwN-TfVXjXUhAYVaWKzuOIyCy1nE8VAdETQk1TqB_39gk5ST8cIcvO2KNgB8d5h1f38W8hIzg2; ss-pid=hMBothYg2ETWObMTMJDY; ss-id=x9zxOTH2rFxLo8tO01Nw
响应验证
HTTP/1.1 200 OK缓存控制:私有内容类型:application/json;charset=utf-8 Vary:Accept服务器:Microsoft IIS/7.5 X-Powered-By:ServiceStack/4.038 Win32NT/。NET访问控制允许来源:*访问控制允许方法:获取、发布、放置、删除、选项访问控制允许标题:内容类型、授权X-AspNet-Version:4.0。30319设置Cookie:ss pid=QJEKGQPHTPJZJJMPTCT;expires=太阳,2036年5月11日12:18:29 GMT;路径=/;HttpOnly Set Cookie:ss id=1yKLtkiTD2NshpiPrffu;路径=/;HttpOnly X-MiniProfiler-Ids:[“1d0459ec1fad4695ac0f3c7fc69cad0a”,“3f5cd3515e084363b86df1e54633a683”,“0f54d87508594cba9757660dc664aeef”]X-Powered-By:ASP。净日期:2016年5月11日星期三12:18:30 GMT内容长度:17514
请求事件源
收到http://localhost/ecmapi/event-stream?channel=MyChannel HTTP/1.1接受:/Origin:http://localhost 接受语言:en GB接受编码:gzip,deflate用户代理:Mozilla/5.0(兼容;MSIE 9.0;Windows NT 6.1;WOW64;Trident/5.0)主机:本地主机连接:保持活动状态Pragma:无缓存
响应事件源
HTTP/1.1 401未经授权的缓存控制:私有变量:接受服务器:Microsoft IIS/7.5 WWW-Authenticate:credentials-realm=“/auth/credentials”X-Powered-By:ServiceStack/4.038 Win32NT/。NET访问控制允许来源:*访问控制允许方法:获取、发布、放置、删除、选项访问控制允许标题:内容类型、授权X-AspNet-Version:4.0。30319设置Cookie:ss pid=c0UQXy4YJNQmVuUiEVfA;expires=太阳,2036年5月11日12:18:30 GMT;路径=/;HttpOnly Set Cookie:ss id=y9e8BbD1na5EoHu8GUug;路径=/;HttpOnly X-MiniProfiler-Ids:[“1d0459ec1fad4695ac0f3c7fc69cad0a”,“3f5cd3515e084363b86df1e54633a683”,“0f54d87508594cba9757660dc664aeef”,“F1584ABD58E64A9DAC6CEAA932C47A”]X供电方式:ASP。净日期:2016年5月11日星期三12:18:30 GMT内容长度:0
/event stream
返回401 Unauthorized的原因是您对/event stream
的请求不包含必要的会话cookie,而会话cookie正是建立经过身份验证的请求的原因。
这只是IE中的一个问题,因为它是最后一个没有对服务器发送事件的本地支持的浏览器,并且需要一个SSE垫片才能在其限制之一是不发送会话Cookies的情况下工作。
默认的是他。中的cshtmlhttp://chat.servicestack.net/default_ieshim Live Demo演示了如何在IE中支持经过身份验证的请求,方法是将ss id
sessionId附加到事件流url,您可以使用以下内容在Razor页面中填充该url:
var source = new EventSource(
'/event-stream?channels=@channels&ss-id=@(base.GetSession().Id)&t='
+ new Date().getTime());
您还需要告诉ServiceStack接受Url中的会话Id,您可以在AppHost的Configure()
中使用:
SetConfig(new HostConfig {
AllowSessionIdsInHttpParams = true,
});
任务:将Kerberos active directory身份验证添加到不安全的报告和数据操作桌面应用程序。此应用程序是。。。 用Stackless Python 2.7编写 使用Twisted进行客户端-服务器交互 客户端编译为exe并在Windows上运行 服务器在Linux(红帽)上运行 目前,我们从用户帐户中提取Windows网络ID(登录名)并传递到服务器,服务器会查找用户配置为具有的权
授权服务器为进行客户端身份验证的目的,为Web应用客户端创建客户端凭据。授权服务器被鼓励考虑比客户端密码更强的客户端身份验证手段。Web应用程序客户端必须确保客户端密码和其他客户端凭据的机密性。 授权不得向本地应用程序或基于用户代理的应用客户端颁发客户端密码或其他客户端凭据用于客户端验证目的。授权服务器可以颁发客户端密码或其他凭据给专门的设备上特定安装的本地应用程序客户端。 当客户端身份验证不可用
在向令牌端点发起请求时,机密客户端或其他被颁发客户端凭据的客户端必须如2.3节所述与授权服务器进行身份验证。客户端身份验证用于: 实施刷新令牌和授权码到它们被颁发给的客户端的绑定。当授权码在不安全通道上向重定向端点传输时,或者 当重定向URI没有被完全注册时,客户端身份验证是关键的。 通过禁用客户端或者改变其凭据从被入侵的客户端恢复,从而防止攻击者滥用被盗的刷新令牌。改变单套客户端凭据显然快于撤销
如果客户端类型是机密的,客户端和授权服务器建立适合于授权服务器的安全性要求的客户端身份验证方法。授权服务器可以接受符合其安全要求的任何形式的客户端身份验证。 机密客户端通常颁发(或建立)一组客户端凭据用于与授权服务器进行身份验证(例如,密码、公/私钥对)。授权服务器可以与公共客户端建立客户端身份验证方法。然而,授权服务器不能依靠公共客户端身份验证达到识别客户端的目的。 客户端在每次请求中不能使用一
有时需要对某些网络资源(如Servlet、JSP等)进行访问权限验证,也就是说,有访问权限的用户才能访问该网络资源。进行访问权限验证的方法很多,但通过HTTP响应消息头的WWW-Authenticate字段进行访问权限的验证应该是众多权限验证方法中比较简单的一个。 通过HTTP响应消息头的WWW-Authenticate字段可以使浏览器出现一个验证对话框,访问者需要在这个对话框中输入用户名和密码,
应如何管理它们? 一些更具体的问题: 根据定义,本机应用程序(实际上是公共客户端)不能安全地存储其凭据(client_id+secret)。是未注册的客户吗?如果我不能使用秘密来验证/验证它,我还应该做什么? 客户端注册≠endpoint注册:第一个是关于注册客户端凭据();第二个关于注册客户端重定向endpoint。重定向endpoint注册是否足以授予客户端的真实性? 客户端凭据授予是否使用相