Jon*_*han 5 token signalr asp.net-core angular
我想为我的 Web 项目添加聊天实时功能。我正在使用 asp.net SignalR 2.4 来实现该功能。但是我很难从集线器类中的不记名令牌中获取 UserId。
我使用 angular 7 从客户端提供令牌,我可以通过集线器类中的查询字符串获取该令牌。
我可以使用以下方法轻松地在我的控制器之一中获取 UserId:
var userId = User.Claims.First(c => c.Type == "UserID").Value;
Run Code Online (Sandbox Code Playgroud)
但是在集线器类中,用户始终为空 来自集线器类的代码:
public override Task OnConnectedAsync()
{
var identity = (ClaimsIdentity)Context.User.Identity;
var connectionId = Context.ConnectionId;
var query = Context.GetHttpContext().Request.Query;
var token = query["access_token"].ToString();
return base.OnConnectedAsync();
}
Run Code Online (Sandbox Code Playgroud)
来自客户端的代码使用 angular 7:
ngOnInit(): void {
this.hubConnection = new signalR.HubConnectionBuilder()
.withUrl('http://localhost:50792/chat',{
accessTokenFactory: () => {
return this.token;
},
} as signalR.IHttpConnectionOptions)
.build();
// this.hubConnection.Headers.Add("Authorization", "Bearer " +
this.token);
this.hubConnection
.start()
.then(() => console.log('Connection started'))
}
Run Code Online (Sandbox Code Playgroud)
您必须挂钩该OnMessageReceived事件才能允许 JWT 身份验证处理程序从查询字符串中读取访问令牌。
builder.Services.AddAuthentication(options =>
{
// ...
}).AddJwtBearer(options =>
{
// ...
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken) && path.StartsWithSegments("/chat"))
{
context.Token = accessToken;
}
return Task.CompletedTask;
}
};
});
Run Code Online (Sandbox Code Playgroud)
来自微软文档。
| 归档时间: |
|
| 查看次数: |
386 次 |
| 最近记录: |