【发布时间】:2018-07-03 22:07:33
【问题描述】:
我正在使用
构建应用程序角度 4
AspNetCore 2
AspNetCore.SignalR 1.0.0-alpha2-final
和 JWT 身份验证
我的问题是这个。我似乎无法在集线器级别对用户进行身份验证
我有一个适用于我所有控制器的要求声明政策
services.AddAuthorization(options =>
{
options.AddPolicy("ApiUser", policy =>
policy.RequireClaim(Constants.Strings.JwtClaimIdentifiers.Rol,
Constants.Strings.JwtClaims.ApiAccess));
});
在我做的控制器中
[Authorize(Policy = "ApiUser")]
这一切都很好。但是,你们中的许多人可能都知道,不允许从 javascript 向 websockets 添加授权标头,因此才华横溢的贡献者提供的解决方案在 https://github.com/aspnet/SignalR 就是将 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;
}
};
});
现在这里是客户端代码(打字稿)
ngOnInit() {
let authToken = localStorage.getItem('auth_token');
this.options = {
transport: TransportType.WebSockets,
authToken: authToken
};
this._hubConnection = new HubConnection('http://localhost:51143/chat',
this.options);
this._hubConnection
.start()
.then(() => console.log('Connection started!'))
.catch(err => console.log('Error while establishing connection :('));
这里的目标是像这样将我的 authtoken 传递给 signalR 集线器(与我在我的 api 控制器上做的一样,效果很好)
[Authorize(Policy = "ApiUser")]
public class ChatHub : HubWithPresence
以便我能够在 HubConnection 上下文中对 User.Identity 进行水合
Clients.All.InvokeAsync("sendToAll", Context.User.Identity.Name,
receivedMessage);
这里的任何帮助将不胜感激! 卡住了几天,这是真正让这些东西一起工作的最后一个缺失的部分。
【问题讨论】:
标签: angular .net-core signalr asp.net-identity