我正在尝试在asp.net core 2.1中进行基于策略的身份验证。由于依赖项注入I,面临500个内部服务器错误。无法弄清楚如何解决问题。
services.AddAuthorization(auth =>
{
auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
.RequireAuthenticatedUser().Build());
auth.AddPolicy("canRead",
policy => policy.Requirements.Add(new PermissionRequirement(PermissionEnum.Read)));
auth.AddPolicy("canCreate",
policy => policy.Requirements.Add(new PermissionRequirement(PermissionEnum.Write)));
auth.AddPolicy("canUpdate",
policy => policy.Requirements.Add(new PermissionRequirement(PermissionEnum.Update)));
auth.AddPolicy("canDelete",
policy => policy.Requirements.Add(new PermissionRequirement(PermissionEnum.Delete)));
});
services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
这是权限检查代码
public class PermissionRequirement : IAuthorizationRequirement
{
public PermissionEnum _permission { get; }
public PermissionRequirement(PermissionEnum permission)
{
_permission = permission;
}
}
public class PermissionHandler : AuthorizationHandler<PermissionRequirement>
{
private readonly IAdminUOW permissionRepository;
public PermissionHandler(IAdminUOW permissionRepository)
{
this.permissionRepository = permissionRepository;
}
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement)
{
if (context.User == null)
{
// no user authorizedd. Alternatively call context.Fail() to ensure a failure
// as another handler for this requirement may succeed
context.Fail();
}
bool hasPermission = await permissionRepository.CheckPermissionForUser(new Guid(context.User.ToString()), requirement._permission);
if (hasPermission)
{
context.Succeed(requirement);
}
}
权限枚举
[Flags]
public enum PermissionEnum
{
None = 0,
Read = 0x001,
Write = 0x010,
Delete = 0x011,
Update = 0x100,
ReadWrite = Read | Write,
FullControl = ReadWrite | Update | Delete
}
}
该错误是由services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
引起的,但不知道我在做什么错。
任何人都可以让我知道如何解决此问题。
参考-https://stormpath.com/blog/tutorial-policy-based-authorization-asp-net-core
答案 0 :(得分:0)
问题出在代码
替换下面的代码
services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
具有以下代码
services.AddTransient<IAuthorizationHandler, PermissionHandler>();