Политика asp.net core 2.x Заявление о неправильной идентификации - PullRequest
0 голосов
/ 01 ноября 2018

Я работаю над использованием избранных политик (в сочетании с аутентификацией 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; }
  }

1 Ответ

0 голосов
/ 02 ноября 2018

Неважно, к какой личности относятся претензии. Но типы заявок должны соответствовать ожидаемым.

Вы можете использовать собственные имена для типов заявок, таких как role, name, но вы также можете использовать стандарты WIF . Просто убедитесь, что типы совпадают. User.IsInRole и т. Д. Ожидают утверждения определенного типа.

Посмотрите на код ниже. Обратите внимание на идентификатор претензии. Я думаю, именно поэтому ваш код не работал.

public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal p)
{
    var id = new ClaimsIdentity("TransformerClaimsMiddleware", 
                  "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", 
                  "http://schemas.microsoft.com/ws/2008/06/identity/claims/role");

    // I don't know what your intention is, but it seems more logical to me to
    // add new claims to the identity, instead of adding the same claim with
    // another type.

    var claims = p.Claims.Where(a => a.ValueType.Contains("Permission")).ToList();

    // Add the claims to the new identity
    claims.ForEach(c => id.AddClaim(new Claim("https://customnamehere.com/claims/permissionclaim", c.Value)));

    p.AddIdentity(id);
    return Task.FromResult(p);
   }
}

Также измените это:

RequireClaim("Permission Level")

до

RequireClaim("https://customnamehere.com/claims/permissionclaim")

Пожалуйста, дайте мне знать, если это поможет.

...