【发布时间】:2018-10-26 21:29:58
【问题描述】:
我已经做了一个索赔过滤器
public class ClaimRequirementAttribute : TypeFilterAttribute
{
public ClaimRequirementAttribute(string claimType, ClaimRoles claimValue) : base(typeof(ClaimRequirementFilter))
{
Arguments = new object[] {new Claim(claimType, claimValue.ToString()) };
}
}
public class ClaimRequirementFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
var headers = context.HttpContext.Request.Headers;
var tokenSuccess = headers.TryGetValue("Token", out var token);
var emailSuccess = headers.TryGetValue("Email", out var email);
var deviceNameSuccess = headers.TryGetValue("DeviceName", out var deviceName);
if (tokenSuccess && emailSuccess && deviceNameSuccess)
{
var accountLogic = context.HttpContext.RequestServices.GetService<IAccountLogic>();
var hasClaim = accountLogic.ValidateLogin(email, token, deviceName).Result.Success;
if (!hasClaim)
{
context.HttpContext.ForbidAsync();
}
}
else
{
context.HttpContext.ForbidAsync();
}
}
}
我已经在我的启动中注册了过滤器
public void ConfigureServices(IServiceCollection services)
{
services.Configure<ConnectionStringsSettings>(Configuration.GetSection("ConnectionStrings"));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddScoped<ClaimRequirementFilter>();
但是当我导航到使用过滤器的操作时出现此错误
[HttpPost]
[ClaimRequirement("Permission", ClaimRoles.Admin)]
public async Task ResetLeaderboard()
InvalidOperationException:找不到适合“Foosball.Logic.ClaimRequirementFilter”类型的构造函数。确保类型是具体的,并且为公共构造函数的所有参数注册了服务
github:https://github.com/Mech0z/Foosball/tree/core2.1/Foosball
【问题讨论】:
-
您需要在问题正文中包含您的代码。如果外部链接中断/被删除,则无济于事。
-
@maccettura 完成
-
您是否考虑过使用基于策略的授权并利用现有的
[Authorize]属性? docs.microsoft.com/en-us/aspnet/core/security/authorization/… -
@Brad 上次让任何类型的内置身份验证与 Mongodb 数据库一起工作似乎很麻烦,并且为我更新到 aspnet 核心 2.0 和转发的 nuget 包很少见。所以现在我只是为这个小足球应用程序做了一些简单的安全性(可能非常不安全),但我可能会在未来看看它:) 但它比我们之前没有安全性要好
标签: c# asp.net-web-api asp.net-core .net-core