c# - SignalR 身份验证问题
问题描述
我正在开发一个 ASP.NET 核心应用程序,我需要实现与 SignalR 的聊天。我使用带有 jwt 的身份来管理登录/权限,这很好。
我按照此文档在 SignalR 集线器中实现身份验证,但它不起作用,即使使用集线器上的 [Authorize] 属性也可以访问我的集线器功能。
这是我配置服务的代码
services
.AddAuthorization()
.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = jwtSettings.Issuer,
ValidAudience = jwtSettings.Issuer,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.Secret)),
ClockSkew = TimeSpan.Zero
};
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];
// If the request is for our hub...
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken) && (path.StartsWithSegments("/chat")))
{
// Read the token out of the query string
context.Token = accessToken;
}
return Task.CompletedTask;
}
};
});
这是我的集线器的代码
[Authorize]
public class Chat : Hub<IChatClientMethods>
{
private readonly ProjectHubContext _context;
private readonly UserManager<User> _userManager;
public Chat(ProjectHubContext context, UserManager<User> userManager) : base()
{
_context = context;
_userManager = userManager;
}
// This method is executed even with the [Authorize] attribute
public override async Task OnConnectedAsync()
{
await base.OnConnectedAsync();
Console.WriteLine("Connected");
var user = await _userManager.GetUserAsync(Context.User); //Always null
}
}
最后是集线器映射
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<Chat>("/chat");
});
为什么我提供随机测试令牌时可以从客户端调用集线器功能?
解决方案
我发现了为什么我的 [Authorize] 标签不起作用。
我用错了。我用using MiNET.Plugins.Attributes;
而不是using Microsoft.AspNetCore.Authorization;
推荐阅读
- vue.js - Vue CLI 3 创建了大量“*.hot-update.js”文件。如何防止这种情况?
- php - 当 AJAX 用于基于下拉菜单选择显示数据时,按钮不起作用
- mysql - 自动增量已自动重置回 1
- sql - 获取指定字符之间的数值
- java - org.hibernate.InstantiationException:没有实体的默认构造函数:com.domaine.AnomalieAck
- laravel - 为什么 laravel/eloquent 找不到某个表?
- c# - 使用数字代码实施电子邮件确认
- php - 如何修复 .htaccess 中 POST 的 Get 方法?
- python - 为什么重定向输出在多处理中不起作用?
- php - 非常长的“等待(TTFB)”时间 - Opencart 3.0.2.0