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 方法
对于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);
}
}
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)根据您的要求更改逻辑
| 归档时间: |
|
| 查看次数: |
3496 次 |
| 最近记录: |