[英]How to custom/override User.IsInRole in ASP.NET Core
我是 ASP.NET Core 的新手,我在控制器的 User 屬性(在 ClaimsPrincipal 類中)中看到,它有 User.IsInRole 方法,所以我如何覆蓋它以調用我的服務依賴項並在我的應用程序中注冊(我不想使用擴展方法)。
您可以使用 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);
}
}
控制器方法:
[Authorize(Roles = "Administrator")]
public IActionResult Get()
{
// ...
}
通過 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); } }
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)
的邏輯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.