要解决此问题,需要确保您的自定义授权服务返回正确的授权结果,而不是一直允许用户访问。
以下是一个示例自定义授权服务,它仅允许经过身份验证的用户访问具有特定策略的控制器:
public class CustomAuthorizationService : IAuthorizationService
{
private readonly IHttpContextAccessor _httpContextAccessor;
public CustomAuthorizationService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public async Task AuthorizeAsync(ClaimsPrincipal user, object resource, IEnumerable requirements)
{
var httpContext = _httpContextAccessor.HttpContext;
if (httpContext.User.Identity.IsAuthenticated)
{
var result = await httpContext.AuthorizeAsync(requirements, resource);
if (result.Succeeded)
{
return AuthorizationResult.Success();
}
}
return AuthorizationResult.Failed();
}
}
在上述示例中,我们注入了IHttpContextAccessor,以便我们可以访问当前用户和HTTP上下文。然后,我们检查用户是否已经身份验证,如果是,则调用AuthorizeAsync方法,以确保用户满足给定的要求。如果AuthorizeAsync返回成功,则我们返回AuthorizationResult.Success(),否则返回AuthorizationResult.Failed()。
要在应用程序中使用此自定义授权服务,请将其作为AddAuthorization的参数之一添加到您的Startup.cs文件中的ConfigureServices方法中:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddHttpContextAccessor();
services.AddSingleton();
services.AddAuthorization(options =>
{
options.AddPolicy("MyPolicy", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireClaim("MyClaim");
});
});
}
然后,在您的控制器或动作方法上使用Authorize特性,并指定您的策略名称:
[Authorize(Policy = "MyPolicy")]
public class MyController : Controller
{
// ...
}