我在我的 SignalR 集线器上实现了自定义授权,但是 HandleRequirementsAsync 方法不会在自定义处理程序上触发(vs 上的断点不会触发)。 这是我的代码:
//Handler
public class GameGroupsAuthorisationConnectRequirementHandler : AuthorizationHandler<GameGroupsAuthorisationConnectRequirement, HubInvocationContext>
{
private RunningGameService _runningGameService;
public GameGroupsAuthorisationConnectRequirementHandler(RunningGameService runningGameService)
{
_runningGameService = runningGameService;
}
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, GameGroupsAuthorisationConnectRequirement requirement, HubInvocationContext resource)
{
if (await IsUserAllowedAndAddData(resource.HubMethodName, resource.Context))
{
context.Succeed(requirement);
}
}
//IsUserAllowedAndData Defined Here
}
要求
public class GameGroupsAuthorisationConnectRequirement: IAuthorizationRequirement
{
}
Program.cs:(相关部分)
builder.Services.AddSingleton<IAuthorizationHandler, GameGroupsAuthorisationConnectRequirementHandler>();
builder.Services.AddSingleton<IAuthorizationHandler, GameMethodAuthorisationRequirementHandler>();
builder.Services.AddAuthentication()
.AddScheme<UserAuthenticationSchemeOptions, UserAuthenticationSchemeHandler>(
"User",
opts => { }
);
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("GameGroupsAuthorisationConnect", policy =>
{
policy.Requirements.Add(new GameGroupsAuthorisationConnectRequirement());
policy.AddAuthenticationSchemes("User");
});
options.AddPolicy("GameMethodAuthorisation", policy =>
{
policy.Requirements.Add(new GameMethodAuthorisationRequirement());
policy.AddAuthenticationSchemes("User");
});
});
在我的中心,我使用这样的授权属性
[Authorize]
//Base Hub Contains Group stuff
public class GameGroupsHub : Hub
{
[Authorize(Policy = "GameGroupsAuthorisationConnect")]
public override async Task OnConnectedAsync()
{
//Stuff
}
//Stuff
}
任何帮助将不胜感激。 谢谢, 阿曼