ServiceStack ServerEvents身份验证配置

时间:2018-01-20 19:11:09

标签: authentication servicestack

我正在尝试使用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功能,并且我移动事件端点可能会扰乱某些内容,但我无法识别它是什么。任何人都可以帮助确定我可以做些什么来解决这个问题或建议进一步的调试步骤?

1 个答案:

答案 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
}