【发布时间】:2016-01-04 19:17:53
【问题描述】:
我在服务器端运行 SignalR 2.2.0 应用程序,在 Android 作为客户端运行 signalr-java-client(自编译,上一个 GitHub 版本)。
目前,有 4 个客户端连接到我的集线器。有时,所有 4 个客户端会同时收到 HTTP 状态 400 和消息“连接 ID 格式不正确”(客户端之前已连接)。我对此进行了多次分析,但无法找到任何信息/模式,何时或为什么会发生这种情况。
连接通过 JWT 保护,令牌绝对有效。检索新令牌时,连接将停止并重新启动。除此之外,该错误不太可能与设备相关,因为该错误同时在所有 4 个客户端上抛出。
我知道,当客户端的身份更改时可能会发生此错误,但对我来说,同时更改 4 个客户端的身份似乎不太可能。
这是用于身份验证的服务器代码(Deepak 询问)。
在我的 Startup.cs 中调用了以下方法:
public static void ConfigureOAuth(IAppBuilder app, string audienceID, string sharedSecret)
{
byte[] secret = TextEncodings.Base64Url.Decode(sharedSecret);
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
Provider = new MyOAuthBearerAuthenticationProvider(),
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { audienceID },
IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
{
new SymmetricKeyIssuerSecurityTokenProvider(Issuer, secret)
}
});
}
这是MyOAuthBearerAuthenticationProvider类的代码:
class MyOAuthBearerAuthenticationProvider : OAuthBearerAuthenticationProvider
{
/// <summary>
/// Get's a JWT from querysting and puts it to context
/// </summary>
public override Task RequestToken(OAuthRequestTokenContext context)
{
if (context.Token == null)
{
string value = context.Request.Query.Get("auth_token");
if (!string.IsNullOrEmpty(value)) //token from queryString
{
context.Token = value;
}
}
return Task.FromResult<object>(null);
}
}
我必须从查询字符串中检索令牌,因为除了 java-client 之外,还使用了一个无法设置标头的 javascript 客户端。
最后,我使用 Authorization 属性保护我的集线器和其中的一些方法:
[Authorize(Roles = "MyExampleRole")]
这是用于连接的客户端代码:
public boolean connect(String url, String token) {
if (connected) {
return true;
}
try {
this.hubConnection = new HubConnection(url, "auth_token=" + token, true, logger);
this.hubProxy = hubConnection.createHubProxy("MyHub");
this.hubProxy.subscribe(this.signalRMethodProvider);
this.hubConnection.stateChanged(stateChangedCallback);
SignalRFuture<Void> awaitConnection = this.hubConnection.start();
awaitConnection.get(10000, TimeUnit.MILLISECONDS);
return true;
}
catch (InterruptedException | TimeoutException | ExecutionException e) {
log.error("connect", e);
return false;
}
}
有没有人有想法,如何解决这个问题或者我可以在哪里收到更多信息?
非常感谢 -卢卡斯
【问题讨论】:
-
请分享您的代码,我可能会有所帮助
-
我应该分享哪个代码?项目本身很大。
-
signalr 授权类
-
查看我上次的编辑,它包含用于授权的代码。
-
对我来说似乎很好...请分享 android 连接启动代码...您在哪里启动集线器..
标签: android signalr owin signalr-hub