У меня есть этот фильтр, и я хочу сослаться на класс, чтобы использовать его метод.Тем не менее, я не могу использовать его в RoleVerificationHandler или даже ссылаться на метод.
Вот как на него ссылаются в Startup.cs.Я не уверен, как сюда добавить ссылку на класс.
services.AddAuthorization(options =>
{
options.AddPolicy("SystemAdministrator", policy => policy.Requirements.Add(new RolesFilter("SystemAdministrator", ApplicationGlobals.ApplicationName)));
});
services.AddSingleton<IAuthorizationHandler, RoleVerificationHandler>();
RolesFilter class
public class RolesFilter : IAuthorizationRequirement
{
public String Role { get; set; }
public String ApplicationName { get; set; }
private DecodeToken decodeToken { get; set; }
public RolesFilter(String Role,String ApplicationName, DecodeToken decodeToken)
{
this.Role = Role;
this.ApplicationName = ApplicationName;
this.decodeToken = decodeToken;
}
}
public class RoleVerificationHandler : AuthorizationHandler<RolesFilter>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolesFilter requirement)
{
//get roles based on app id, then check if the user has the correct role
var roles = context.User.Claims.Where(c => c.Type == "Roles").Select(c => c.Value).ToList();
foreach(var item in roles)
{
var currentItem = JsonConvert.DeserializeObject<UserRoleDetailsViewModel>(item);
UserRoleDetailsViewModel urdvm = new UserRoleDetailsViewModel
{
Id = currentItem.Id,
Name = currentItem.Name,
ApplicationId = currentItem.ApplicationId,
ApplicationName = currentItem.ApplicationName
};
if(requirement.Role == urdvm.Name && urdvm.ApplicationName == ApplicationGlobals.ApplicationName)
{
context.Succeed(requirement);
}
}
return Task.CompletedTask;
}
}