【发布时间】:2020-04-17 22:34:21
【问题描述】:
我正在尝试添加一些基于authorisation 的自定义角色,但我无法添加
将 Startup 配置为调用我的 AuthorizationHandler。
我在 GitHub 上找到了一些相关信息:here。 这是不是一个错误?
我正在使用ASP.NET Core 3.1,我的初始化如下:
1:这使用 Dapper ORM 从数据库中检索 url/角色:
private List<UrlRole> GetRolesRoutes()
{
var urlRole = DapperORM.ReturnList<UrlRole>("user_url_role_all");
return urlRole.Result.ToList();
}
2:在我的 Startup 中,我获取 url/roles 并将结果存储在全局变量中:
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
this.environment = env;
UrlRoles = GetRolesRoutes();
}
3:我的配置是:注意传递的UrlRoles
public void ConfigureServices(IServiceCollection services)
{
// .. snip
services.AddAuthorization(o =>
o.AddPolicy(_RequireAuthenticatedUserPolicy,
builder => builder.RequireAuthenticatedUser()));
services.AddAuthorization(options =>
{
options.AddPolicy("Roles", policy =>
policy.Requirements.Add(new UrlRolesRequirement(UrlRoles)));
});
services.AddSingleton<AuthorizationHandler<UrlRolesRequirement>, PermissionHandler>();
}
5:我的处理程序:没有被调用
public class PermissionHandler : AuthorizationHandler<UrlRolesRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, UrlRolesRequirement urlRolesRequirement)
{
var pendingRequirements = context.PendingRequirements.ToList();
foreach (var requirement in pendingRequirements)
{
}
return Task.CompletedTask;
}
}
6:我的需求类:
public class UrlRolesRequirement : IAuthorizationRequirement
{
private List<UrlRole> UrlRoles { get; }
public UrlRolesRequirement(List<UrlRole> urlRoles)
{
UrlRoles = urlRoles;
}
}
当我调试ASP.NET CoreAuthorizationHandler 时,我从来没有看到我的自定义需求是我在启动中配置的需求。我希望看到要求,如果存在要求,那么我假设会发生“回调”。但由于某种原因,我的配置未能添加要求。
public virtual async Task HandleAsync(AuthorizationHandlerContext context)
{
if (context.Resource is TResource)
{
foreach (var req in context.Requirements.OfType<TRequirement>())
{
await HandleRequirementAsync(context, req, (TResource)context.Resource);
}
}
}
【问题讨论】:
-
您是否在某处使用您的自定义策略?除非您明确要求该策略的授权,或者除非您将该策略设为默认策略,否则不需要满足该要求,这意味着不会调用您的处理程序。
-
@poke 你能举个例子吗?
-
猜测这里的问题可能是您应该注册您的 PermissionHandler 处理程序,使其依赖于
IAuthorizationHandler而不是AuthorizationHandler<UrlRolesRequirement>。试试改成services.AddSingleton<IAuthorizationHandler, PermissionHandler>(); -
@Dennis1679 如果我这样做,我不会丢失被注入的对象吗?我更新了我的问题以显示如何检索和传递 UrlRoles。问题是由于某种原因回调没有发生,我认为我的配置不正确。 poke 提到了一些选项,但还不清楚如何解决这个问题。
-
我只是想知道是否需要 MVC 或者可以使用端点
标签: c# asp.net-core