Как настроить / переопределить User.IsInRole в ASP.NET Core - PullRequest
0 голосов
/ 10 октября 2018

Я новичок в ASP.NET Core, я вижу в свойстве User (в классе ClaimsPrincipal) в моем контроллере, у него есть метод User.IsInRole, так как я могу переопределить его, чтобы вызвать мою сервисную зависимость и зарегистрироваться вмое приложение (я не хочу использовать метод расширения).

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Вы можете использовать ClaimsTransformation:

public class Startup
{
    public void ConfigureServices(ServiceCollection services)
    {
        // ...
        services.AddTransient<IClaimsTransformation, ClaimsTramsformer>();
    }
}

public class CustomClaimsPrincipal : ClaimsPrincipal
{
    public override bool IsInRole(string role)
    {
        // ...
        return base.IsInRole(role);
    }
}

public class ClaimsTransformer : IClaimsTransformation
{
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var customPrincipal = new CustomClaimsPrincipal(principal) as ClaimsPrincipal;
        return Task.FromResult(customPrincipal);
    }
}

Метод контроллера:

[Authorize(Roles = "Administrator")]
public IActionResult Get()
{
    // ...
}

При проверке роли по атрибуту Authorize будет использоваться ваш переопределенный метод IsInRole

0 голосов
/ 11 октября 2018

Для User.IsInRole это ClaimsPrincipal, который не зарегистрирован как сервис, поэтому вы не можете заменить ClaimsPrincipal и не можете переопределить IsInRole.

Для обходного пути, если вы не будете использовать метод расширения, вы можете попробовать реализовать свои собственные ClaimsPrincipal и Controller.

  • CustomClaimsPrincipal, который наследуется от ClaimsPrincipal

    public class CustomClaimsPrincipal: ClaimsPrincipal
    {
    
    public CustomClaimsPrincipal(IPrincipal principal):base(principal)
    {
    
    }
    
    public override bool IsInRole(string role)
    {
        return base.IsInRole(role);
    }
    }
    
  • ControllerBase для изменения ClaimsPrincipal User на CustomClaimsPrincipal User

    public class ControllerBase: Controller
    {
        public new CustomClaimsPrincipal User => new CustomClaimsPrincipal(base.User);
    }
    
  • Изменить Controller от наследования ControllerBase.

    public class HomeController : ControllerBase
    {
           public IActionResult About()
    {
        ViewData["Message"] = "Your application description page.";
        var result = User.IsInRole("Admin");
    
        return View();
    }
    
  • Измените логику в public override bool IsInRole(string role) в соответствии с вашими требованиями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...