我是 ASP.NET Core 的新手,我在控制器的 User 属性(在 ClaimsPrincipal 类中)中看到,它有 User.IsInRole 方法,所以我如何覆盖它以调用我的服务依赖项并在我的应用程序中注册(我不想使用扩展方法)。
You can use 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);
}
}
Controller method:
[Authorize(Roles = "Administrator")]
public IActionResult Get()
{
// ...
}
Role checking by Authorize attribute will use your overrided IsInRole method
For User.IsInRole
, it is ClaimsPrincipal
which is not registered as service, so, you could not replace ClaimsPrincipal
, and you could not override IsInRole
.
For a workaround, if you would not use extension method, you could try to implement your own ClaimsPrincipal
and Controller
.
CustomClaimsPrincipal
which is inherited from ClaimsPrincipal
public class CustomClaimsPrincipal: ClaimsPrincipal { public CustomClaimsPrincipal(IPrincipal principal):base(principal) { } public override bool IsInRole(string role) { return base.IsInRole(role); } }
ControllerBase
to change ClaimsPrincipal User
to CustomClaimsPrincipal User
public class ControllerBase: Controller { public new CustomClaimsPrincipal User => new CustomClaimsPrincipal(base.User); }
Change the Controller
from inheriting ControllerBase
.
public class HomeController : ControllerBase { public IActionResult About() { ViewData["Message"] = "Your application description page."; var result = User.IsInRole("Admin"); return View(); }
Change the logic in public override bool IsInRole(string role)
based on your requirement
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.