Angular 用JWT验证信号集线器
我正在使用 角度4 AspNetCore 2 AspNetCore.SignalR 1.0.0-alpha2-final 和JWT身份验证 我的问题是这个。我似乎无法在集线器级别对用户进行身份验证 我有一个适用于我所有控制器的require claim策略Angular 用JWT验证信号集线器,angular,.net-core,signalr,asp.net-identity,Angular,.net Core,Signalr,Asp.net Identity,我正在使用 角度4 AspNetCore 2 AspNetCore.SignalR 1.0.0-alpha2-final 和JWT身份验证 我的问题是这个。我似乎无法在集线器级别对用户进行身份验证 我有一个适用于我所有控制器的require claim策略 services.AddAuthorization(options => { options.AddPolicy("ApiUser", policy =>
services.AddAuthorization(options =>
{
options.AddPolicy("ApiUser", policy =>
policy.RequireClaim(Constants.Strings.JwtClaimIdentifiers.Rol,
Constants.Strings.JwtClaims.ApiAccess));
});
在控制器中,我做到了
[Authorize(Policy = "ApiUser")]
这一切都很好。然而,你们中的许多人可能知道,不允许从javascript向WebSocket添加授权头,因此,有才华的贡献者在
是将JWT令牌作为查询字符串传递
然而,这让我有点难以理解。这是startup.cs中的身份验证配置
services.Configure<JwtIssuerOptions>(options =>
{
options.Issuer =
jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
options.Audience =
jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)];
options.SigningCredentials = new
SigningCredentials(_signingKey,
SecurityAlgorithms.HmacSha256);
});
var tokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer =
jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)],
ValidateAudience = true,
ValidAudience =
jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)],
ValidateIssuerSigningKey = true,
IssuerSigningKey = _signingKey,
RequireExpirationTime = false,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme =
JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme =
JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(configureOptions =>
{
configureOptions.ClaimsIssuer =
jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
configureOptions.TokenValidationParameters =
tokenValidationParameters;
configureOptions.SaveToken = true;
configureOptions.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var signalRTokenHeader =
context.Request.Query["signalRTokenHeader"];
if (!string.IsNullOrEmpty(signalRTokenHeader) &&
(context.HttpContext.WebSockets.IsWebSocketRequest ||
context.Request.Headers["Accept"] == "text/event-stream"))
{
context.Token =
context.Request.Query["signalRTokenHeader"];
}
return Task.CompletedTask;
}
};
});
这里的目标是像这样将authtoken传递给SignalrHub(与我在api控制器上的方式相同,它工作得很好)
这样我就可以在HubConnection上下文中添加User.Identity
Clients.All.InvokeAsync("sendToAll", Context.User.Identity.Name,
receivedMessage);
任何帮助都将不胜感激!
被困了几天,这是最后一个让这些东西真正协同工作的缺失部分。我看到您使用的是1.0.0-alpha2。不幸的是,1.0.0-alpha2中的TypeScript客户端没有JWT支持。要使用JWT,您需要使用即将到来的preview1客户端的夜间版本。有关更多详细信息,请参阅。我看到您正在使用1.0.0-alpha2。不幸的是,1.0.0-alpha2中的TypeScript客户端没有JWT支持。要使用JWT,您需要使用即将到来的preview1客户端的夜间版本。有关详细信息,请参阅。谢谢你,安德鲁,我会调查的。目前,我选择对集线器使用cookie身份验证,而不是jwt。我可以[授权]我的控制器,但集线器再次抛出401。我的当前版本也不支持cookie身份验证吗?实际上,没关系。我已将我的客户端更新为最新预览。根据我的代码,你能告诉我我可能做错了什么吗?预览没帮到我,我会调查的。目前,我选择对集线器使用cookie身份验证,而不是jwt。我可以[授权]我的控制器,但集线器再次抛出401。我的当前版本也不支持cookie身份验证吗?实际上,没关系。我已将我的客户端更新为最新预览。根据我的代码,你能告诉我我可能做错了什么吗?预览对我没有帮助,因为
[Authorize(Policy = "ApiUser")]
public class ChatHub : HubWithPresence
Clients.All.InvokeAsync("sendToAll", Context.User.Identity.Name,
receivedMessage);