【问题标题】:ClaimRequirementFilter - OnAuthorization isn't calledClaimRequirementFilter - 不调用 OnAuthorization
【发布时间】:2018-09-13 13:15:22
【问题描述】:

我已经实现了ClaimRequirementFilter,但是没有调用 OnAuthorization 方法。下一行代码添加到 Startup 类的 ConfigureServices 方法中:

services.AddMvc(config => config.Filters.Add(typeof(ClaimRequirementFilter)));

我正在使用下一个命名空间:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

【问题讨论】:

  • 你添加授权和认证吗?
  • @aguafrommars 我已经实现了 public AuthenticationFilter(RequestDelegate next) 并使用了 app.UseMiddleware();在启动类中。如果你的意思是别的,你能否解释一下实现认证/授权部分的正确方法。我想进行身份验证(在 AuthenticationFilter 中调用 SSO api)并在 ClaimRequirementFilter 中检查登录用户是否具有执行请求的特定权限。
  • 我个人更喜欢使用政策来检查索赔:docs.microsoft.com/en-us/aspnet/core/security/authorization/…
  • 并使用 OpenIdConnect 和身份验证中间件:docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/…
  • 您的 SSO 是什么?我认为您不需要自定义身份验证中间件

标签: c# asp.net-core authorization


【解决方案1】:

为了解决op的与OnAuthorization相关的问题没有被调用,分享working demo

在尝试激活“MyNamespace.ClaimRequirementFilter”时无法解析“System.Security.Claims.Claim”类型的服务。

对于这个错误,定义你自己的Claimlike

  public class Claim
{
    public string Type { get; set; }
    public string Value { get; set; }
}

然后在Startu.cs注册就好了

services.AddTransient<Claim>();
        services.AddMvc(c =>
                        {
                            c.Filters.Add(typeof(RequestLoggerActionFilter));
                            c.Filters.Add(typeof(ClaimRequirementFilter));
                        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

【讨论】:

  • 谢谢,但这会导致下一个错误:“找不到适合类型 'MyNamespace.ClaimRequirementFilter' 的构造函数。确保类型是具体的,并且为公共构造函数的所有参数注册了服务。”
  • @Odrai 您可以下载此project 以获取完整代码。
  • 我正在使用您的测试项目,但它不包含该属性。
  • ClaimRequirementFilter 的构造函数被调用了两次。在第一次调用期间,Claim 对象(参数)属性为空,而在第二次调用中它们被填充。 OnAuthorization 只调用一次,使用空值。
猜你喜欢
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多