Я работаю над использованием избранных политик (в сочетании с аутентификацией Windows). То, чего я хочу добиться - это просто, я хочу, чтобы пользователь был авторизован для доступа к приложению через Windows Auth, но ограничивал доступ к разделам сайта интрасети с помощью политик. Моя проблема заключается в том, что при добавлении заявки она добавляется в System.Security.Claims.ClaimsIdentity вместо System.Security.Principal.WindowsIdentity. Это проблема, потому что policy.RequireClaim ("MyTotallyCoolPolicyName") ищет только xxPrincipal.WindowsIdentiy. Кстати, данные о претензиях, которые я пытаюсь добавить, взяты из БД.
Соответствующий код ниже:
Startup.cs
services.AddScoped ();
services.AddAuthorization(options =>
{
options.AddPolicy("SuperUser", policy =>
{
policy.RequireAuthenticatedUser();
policy.Requirements.Add(new UserRequirement());
policy.RequireClaim("Permission Level");
});
});
services.AddScoped<Data.Interface.IAuthorization, Data.EDL.Authorization>();
services.AddScoped<IAuthorizationHandler, UserPermissionAuthHandler>();
services.AddScoped<IClaimsTransformation, ClaimsTransformer>();
ClaimsTransformer.cs
public class ClaimsTransformer : IClaimsTransformation
{
private IHttpContextAccessor _httpContextAccessor;
public ClaimsTransformer(IHttpContextAccessor httpContext)
{
_httpContextAccessor = httpContext;
}
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal p)
{
var pp = new ClaimsPrincipal();
p.AddIdentity(new ClaimsIdentity("https://customnamehere.com/claims/permissionclaim", "Permission Level", "1"));
if(p.Claims.Any(a => a.ValueType.Contains("Permission")))
{
}
return Task.FromResult(p);
}
}
и вот как это выглядит:
Смотрите там две личности
Есть ли способ перейти к другим утверждениям при использовании RequireClaims? Или я неправильно его использую?
Fwiw, мне не нужно «добавлять» нового пользователя в систему. Пользователь уже существует. Так что класс UserManager ко мне не относится.
Добавление метода контроллера:
[Authorize(AuthenticationSchemes ="Windows", Policy = "SuperUser")]
public IActionResult About()
{
ViewData["Message"] = "Your application description page.";
return View();
}
Добавление класса UserRequirement:
public class UserRequirement : IAuthorizationRequirement
{
public string EmailAddress { get; private set; }
public string UserName { get; set; }
public int PermissionID { get; set; }
public bool HasPermission { get; set; }
public bool IsActive { get; set; } = false;
public string PermissionName { get; set; }
}