我在OpenIddict的ASP.NET Core 2.0应用程序中使用JWT身份验证。
我在this thread中关注想法并在SignalR握手后调用AuthorizeWithJWT
方法。但是现在,我不知道我应该在AuthorizeWithJWT
方法中设置什么,所以我可以使用[Authorize(Roles="Admin")]
作为例子。
我尝试过设置上下文用户,但它是readonly:
public class BaseHub : Hub
{
public async Task AuthorizeWithJWT(string AccessToken)
{
//get user claims from AccesToken
this.Context.User = user; //error User is read only
}
}
使用authorize属性:
public class VarDesignImportHub : BaseHub
{
[Authorize(Roles = "Admin")]
public async Task Import(string ConnectionString)
{
}
}
答案 0 :(得分:6)
我强烈建议您继续在握手级别进行身份验证,而不是使用您在SignalR级别实施的自定义和非标准解决方案。
假设您正在使用验证处理程序,您可以强制它从查询字符串中检索访问令牌:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication()
.AddOAuthValidation(options =>
{
options.Events.OnRetrieveToken = context =>
{
context.Token = context.Request.Query["access_token"];
return Task.CompletedTask;
};
});
}
或OnMessageReceived
如果您想使用JWTBearer
:
services.AddAuthentication()
.AddJwtBearer(o =>
{
o.Events = new JwtBearerEvents()
{
OnMessageReceived = context =>
{
if (context.Request.Path.ToString().StartsWith("/HUB/"))
context.Token = context.Request.Query["access_token"];
return Task.CompletedTask;
},
};
});
不需要进行任何其他更改。