我正在尝试使用ServiceStack ServerEvents进行JWT身份验证,以确保所有用户都经过身份验证,但我找不到如何配置服务器事件来执行此操作。我认为这可以在默认配置中工作,因为在文档中没有提到如何使它工作,只是它确实如此,这意味着我的配置中的某些东西已经禁用/破坏了这个功能,但我无法解决这个问题。
在服务器端,Configure()中的设置非常简单。
this.Plugins.Add(
new AuthFeature(
() => { return new AuthenticatedSession(); },
new IAuthProvider[] { jwt, perpetualJwt }
)
{
IncludeAssignRoleServices = false,IncludeRegistrationService = false
}
);
this.Plugins.Add(
new ServerEventsFeature
{
StreamPath = ApiHost.EventSystemRoot +"-stream", // /request/event-stream
HeartbeatPath = ApiHost.EventSystemRoot + "-heartbeat",
UnRegisterPath = null,
SubscribersPath = null,
LimitToAuthenticatedUsers = true,
IdleTimeout = TimeSpan.FromSeconds(30),
HeartbeatInterval = TimeSpan.FromSeconds(20),
NotifyChannelOfSubscriptions = true,
}
);
jwt和perpetualJwt提供程序是JsonWebTokeynAuthProviders(处理承载令牌jwt),我已经使用标准的servicestack api请求,所以我相信它们的功能是正确的,但是它们可能没有被调用。
要连接客户端,我使用如下代码:
this.directBoardClient = new JsonServiceClient(this.boardUrlTextBox.Text)
{
BearerToken = this.boardTokenTextBox.Text
};
this.directBoardEvents = new ServerEventsClient(this.boardUrlTextBox.Text.AppendPath("ueib", "request"))
{
OnMessage = boardEvents_OnMessage,
OnCommand = boardEvents_OnCommand
};
this.directBoardEvents.ServiceClient=this.directBoardClient;
this.directBoardEvents.Start();
当我调用start时,我得到401.如果我不需要auth或省略serverevents客户端,directBoardClient可以进行需要auth成功的调用。
我认为当我连接到流端点时没有调用auth功能,并且我移动事件端点可能会扰乱某些内容,但我无法识别它是什么。任何人都可以帮助确定我可以做些什么来解决这个问题或建议进一步的调试步骤?
答案 0 :(得分:3)
ServerEventsClient.ServiceClient
并非用于建立服务器事件连接,只有CookieContainer is shared允许您使用ServiceClient
进行身份验证以建立Authenticated Session 。
如果您正在使用JWT AuthProvider,则可以send it inside a Cookie,以便通过客户端Web请求发送它。否则,您可以尝试使用在建立服务器事件连接之前执行的EventStreamRequestFilter
添加JWT令牌,例如:
new ServerEventsClient(...) {
EventStreamRequestFilter = req => req.AddBearerToken(jwt)
}
或者ResolveStreamUrl
var sseClient = new ServerEventsClient(BaseUrl, ["*"], {
resolveStreamUrl: url => appendQueryString(url, { "ss-tok": JWT }),
handlers: {
onConnect: e => {
console.log(e.isAuthenticated /*true*/, e.userId, e.displayName);
}
}
}).start();
,它允许您修改用于建立服务器事件连接的URL,这也允许您将JWT令牌添加到QueryString中just added support:
EventStreamPath
此更改还允许您独立于先前假定为BaseUri
的{{1}}修改{BaseUrl}/event-stream
。
ResolveStreamUrl + EventStreamPath可从v5.0.3获得,现在是seen in the JWT TypeScript ServerEventsClient example。
这要求您的JWT AuthProvider通过QueryString接受JWT令牌,您可以在ServiceStack的JWT AuthProvider中启用它:
new JwtAuthProvider {
AllowInQueryString = true
}