我正在使用我的自定義授權過濾器,因為它在這里 如何在 ASP.NET Core 中創建自定義 AuthorizeAttribute? 但在運行時收到此錯誤: “InvalidOperationException:找不到適合型別 'papillon.Common.RoleRequirementFilter' 的建構式。確保型別是具體的,并且為公共建構式的所有引數注冊了服務。'。” 我應該更改我的 startup.cs 中的一些代碼?!?!
這是我的 AuthorizationFilter
public class RoleRequirementFilter : IAuthorizationFilter
{
private readonly string[] _rolesNames;
public RoleRequirementFilter(string[] roleNames)
{
_rolesNames = roleNames;
}
public void OnAuthorization(AuthorizationFilterContext context)
{
if (context.HttpContext.User.IsInRole("Support"))
return;
foreach (var item in _rolesNames)
if (context.HttpContext.User.IsInRole(item))
return;
context.Result = new ForbidResult();
// context.Result = new UnauthorizedResult();
}
}
這是我的 TypeFilterAttribute
public class RoleRequirementAttribute : TypeFilterAttribute
{
public RoleRequirementAttribute(string[] roleNames) : base(typeof(RoleRequirementFilter))
{
Arguments = roleNames;
}
}
這是我的startup.cs
services.AddControllersWithViews().AddRazorRuntimeCompilation();
// ...
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}").RequireAuthorization();
endpoints.MapRazorPages().RequireAuthorization();
});
這就是我在控制器中使用它的方式
[RoleRequirement(roleNames:new string[]{Roles.Admin1, Roles.Admin2, Roles.Center1})]
uj5u.com熱心網友回復:
TypeFilterAttribute.Arguments是將傳遞給您正在構建的過濾器的建構式的物件陣列。您的過濾器有一個建構式引數roleNames,它恰好是一個字串陣列。但是通過設定,Arguments = roleNames您可以有效地告訴框架將每個角色名稱作為單獨的引數傳遞給過濾器的建構式。但是由于您的過濾器沒有可變數量的字串引數(而只有一個字串陣列引數),因此不會匹配。
因此,您應該調整您的型別過濾器,將字串陣列本身作為唯一引數傳遞給您的過濾器:
public class RoleRequirementAttribute : TypeFilterAttribute
{
public RoleRequirementAttribute(string[] roleNames) : base(typeof(RoleRequirementFilter))
{
Arguments = new object[] { roleNames };
}
}
uj5u.com熱心網友回復:
您可以將您的角色定義為列舉,然后使用 ResultFilterAttribute 來接受任何像這樣的 inRole 用戶:
public class UserAuthorization : ResultFilterAttribute
{
RolesEnum[] _roles;
public UserAuthorization(RolesEnum[] roles)
{
_roles = roles;
}
public override void OnResultExecuting(ResultExecutingContext context)
{
// if not in role throw exception
base.OnResultExecuting(context);
}
}
在任何控制器上方,您都可以像這樣使用此屬性:
[UserAuthorization(new RolesEnum[] { RolesEnum.Admin1, RolesEnum.Branch1,RolesEnum.Center1 })]
public class MyController : Controller
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/369544.html
標籤:C# asp.net核心 验证 asp.net-core-mvc 授权
上一篇:AuthenticationStateProvider中的UserID顯示為空
下一篇:需要有關重繪令牌機制的幫助
