服务器事件:如何要求授权客户?

时间:2014-10-02 15:52:25

标签: servicestack

我有一个ServerEventsClient,当服务器引发一个事件时会收到通知。 服务器具有可用的自定义CredentialsAuthProvider实现。

这是启动客户端的代码(我在服务器上自定义URL):

  int port = 4711;
  string baseMessagingUrl = "http://localhost:{0}/messaging".Fmt(port);
  string authorizationUrl = "http://localhost:{0}/api/auth/login".Fmt(port);

  string channel = "customer/4711";

  var client = new ServerEventsClient(baseMessagingUrl, channel);
  client.RegisterNamedReceiver<CcuEventReceiver>("ccu");

  client.ServiceClient.Post<AuthenticateResponse>(authorizationUrl, new Authenticate
  {
    provider = CredentialsAuthProvider.Name,
    UserName = "fred",
    Password = "123",
    RememberMe = true,
  });


  client.Start();

在服务器上:在发送消息之前,我通过

检查订阅详情
List<Dictionary<string, string>> subscriptionsDetails = _serverEvents.GetSubscriptionsDetails(changeEvent.CustomerId);

它们不包含我在授权期间发送的预期身份验证详细信息,但是:

"userId": -6
"displayName": user6
"profileUrl": a url to githubusercontent

“OnConnect”事件(ServerEventsFeature)中的相同信息。

如何确保只有经过身份验证的客户才能订阅活动?

1 个答案:

答案 0 :(得分:1)

ServerEventsClientAuthenticate进行身份验证的支持已added in this commit v4.0.32 + now on MyGet

验证ServerEvents客户端

有新的显式AuthenticateAsyncclient.Authenticate(new Authenticate { provider = CredentialsAuthProvider.Name, UserName = "fred", Password = "123", RememberMe = true, }); client.Start(); API可用于验证ServerEvents ServiceClient现在与Cookie共享与连接到事件流的WebRequest,所以您现在可以通过以下方式进行身份验证:

ServerEventsClient

这些API只是public static AuthenticateResponse Authenticate(this ServerEventsClient client, Authenticate request) { return client.ServiceClient.Post(request); } 上的扩展方法,因此如果您想要自定义行为,可以轻松扩展:

LimitToAuthenticatedUsers

仅限经过身份验证的客户端的服务器事件

ServerEventsFeature中还有一个新的Plugins.Add(new ServerEventsFeature { LimitToAuthenticatedUsers = true, }); 选项,用于限制对经过身份验证的客户端的访问:

401 Unauthorized

启用后,将为未经身份验证的客户端返回{{1}}。