我在服务器端运行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;
}
}
是否有人有想法,如何解决此问题或我可能会收到更多信息?
非常感谢你 -Lukas
答案 0 :(得分:0)
看起来很好...... 你可以做的改变是改变
2^>^&1
到
awaitConnection.get(10000, TimeUnit.MILLISECONDS);