如何在 ASP.NET Core 中自定义/覆盖 User.IsInRole

tru*_*.it 7 asp.net asp.net-core

我是 ASP.NET Core 的新手,我在控制器的 User 属性(在 ClaimsPrincipal 类中)中看到,它有 User.IsInRole 方法,那么我如何重写它来调用我的服务依赖项并在我的应用程序中注册(我不想使用扩展方法)。

Che*_*Kot 11

您可以使用 ClaimsTransformation:

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

public class CustomClaimsPrincipal : ClaimsPrincipal
{
    public CustomClaimsPrincipal(IPrincipal principal): base(principal)
    {}

    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);
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器方法:

[Authorize(Roles = "Administrator")]
public IActionResult Get()
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

Authorize 属性进行的角色检查将使用您重写的 IsInRole 方法


Tao*_*hou 0

对于User.IsInRole,它ClaimsPrincipal没有注册为服务,因此,您无法替换ClaimsPrincipal,也无法覆盖IsInRole

作为解决方法,如果您不使用扩展方法,您可以尝试实现您自己的ClaimsPrincipalController.

  • CustomClaimsPrincipal这是继承自ClaimsPrincipal

    public class CustomClaimsPrincipal: ClaimsPrincipal
    {
    
    public CustomClaimsPrincipal(IPrincipal principal):base(principal)
    {
    
    }
    
    public override bool IsInRole(string role)
    {
        return base.IsInRole(role);
    }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • ControllerBase改为ClaimsPrincipal UserCustomClaimsPrincipal User

    public class ControllerBase: Controller
    {
        public new CustomClaimsPrincipal User => new CustomClaimsPrincipal(base.User);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 改变Controller继承ControllerBase

    public class HomeController : ControllerBase
    {
           public IActionResult About()
    {
        ViewData["Message"] = "Your application description page.";
        var result = User.IsInRole("Admin");
    
        return View();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • public override bool IsInRole(string role)根据您的要求更改逻辑