0

Я ищу «простой» способ автоматического добавления заявлений о роли к локальному пользователю для проверки моей логики авторизации; то есть, желая добавить некоторые конкретные претензии к локальному пользователю, прежде чем они будут разрешены моими контроллерами..NET Core MVC добавляет заявку на роль локального пользователя при разработке до авторизации

Я узнал, что в прошлом что-то похожее на это можно было бы сделать для контроллеров:

#if DEBUG 
protected override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    var roles = new[] { "role-under-test"}; 
    HttpContext.User = new GenericPrincipal(new GenericIdentity("DebugUser"), roles); 
    base.OnAuthorization(filterContext); 
} 
#endif 

Но это было до .NET Ядра, который является то, что я работаю в настоящее. Медленно я проработал свой путь к приведенному ниже коду, который, похоже, работает, но, очевидно, гораздо более сложный вопрос по сравнению с приведенным выше примером. Поэтому мой вопрос: знает ли кто-нибудь лучше - более простой способ достичь этого?

Атрибут пользовательские разрешения:

public class CustomAuthAttribute : RolesAuthorizationRequirement { 
    public CustomAuthAttribute(IEnumerable<string> allowedRoles) : base(allowedRoles) { } 

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolesAuthorizationRequirement requirement) { 
#if DEBUG 
     context.User.AddIdentity(new ClaimsIdentity(new GenericIdentity("DebugUser"), new[] { 
      new Claim(ClaimsIdentity.DefaultRoleClaimType, "users"), 
      new Claim(ClaimsIdentity.DefaultRoleClaimType, "admins") 
     })); 
#endif 
     return base.HandleRequirementAsync(context, requirement); 
    } 
} 

В Startup.cs

public void ConfigureServices(IServiceCollection services) { 
    // ... 

    services.AddAuthorization(options => 
     options.AddPolicy("UsersAndAdmins", 
      policy => policy.AddRequirements(new CustomAuthAttribute(new []{"users", "admins"})))); 
} 

И затем использовать его в контроллерах:

[Authorize(Policy = "UsersAndAdmins")]  
public class HomeController : Controller { 
    // ... 
+1

Вы проверили https: // channel9.msdn.com/ Блоги/Seth-Juarez/Advanced-aspNET-Core-Authorization-with-B arry-Dorrans на канале 9. Кажется, они вам очень помогут. Это 2 видео-серии, но там много отличной информации. это на самом деле второй из двух –

ответ

1

Вы хотите преобразование претензий;

Написать преобразование утверждает, что выглядит как

public class ClaimsTransformer : IClaimsTransformer 
{ 
    public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context) 
    { 
     ((ClaimsIdentity)context.principal.Identity).AddClaim(new Claim("Admin", "true")); 
     return Task.FromResult(principal); 
    } 
} 

и провод его внутри Configure в startup.cs

app.UseClaimsTransformation(new ClaimsTransformationOptions 
{ 
    Transformer = new ClaimsTransformer() 
}); 

Конечно, если это для теста вы бы обернуть его внутри проверки окружающей среды, чтобы обеспечить вы находитесь в своей среде dev :)

+0

Вы сами пробовали этот код? С помощью 'IClaimsTransformer' мне пришлось реализовать« public Task TransformAsync (ClaimsTransformationContext) »вместо функции, о которой вы говорили выше. Но кроме этого ответ был, безусловно, ответом, который помог мне, поэтому я буду принимать его как ответ, если вы отредактируете ответ, чтобы отразить этот комментарий. :) –

+1

ХА, нет, он изменился на RTM. Мой плохой, извините за то, что я ленив – blowdart