【问题标题】:Skip a MediatR Behavior Pipeline跳过 MediatR 行为管道
【发布时间】:2019-11-15 05:41:22
【问题描述】:

我一直在使用 MediatR Pipelines 来做以下事情(以相同的顺序)

  1. 添加当前登录用户的声明。
  2. 根据声明集授权用户。
  3. 验证输入模型
  4. 性能跟踪管道行为。

对于步骤 1 和 2。我的 MediatR 对象继承自一个名为 Request 的类,如下所示。

public class Request
    {
        /// <summary>
        /// Gets or sets the current login user.
        /// </summary>
        [JsonIgnore]
        public ClaimsPrincipal User { get; set; }
    }

这是一个示例 MediatR 查询对象。

 public class GetById : Request, IRequest<CompanyViewModel>
    {
        /// <summary>
        /// Gets or sets the Company Id.
        /// </summary>
        public int CompanyId { get; set; }
    }

这是我在 1) 中注入 IHttpContextAccessor 并获取声明的管道行为。

public class AttachContextUserPipelineBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
    where TRequest : Request

这是 2) 我授权用户的管道行为。

public class AuthorizationPipelineBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
        where TRequest : Request

到目前为止这还不错,但我现在有几个不需要授权的查询/命令对象(有点允许匿名)。但是在这个方案中,我必须从 Request 继承 Query/Command 类,并且还定义了一个授权管道处理程序。否则,会引发异常。

我怎样才能拥有这种方案,只是跳过/跳转授权管道并直接触发 MediatR 命令,以便调用它的处理程序并跳过其间的授权处理程序?

【问题讨论】:

    标签: c# asp.net-core mediatr


    【解决方案1】:

    有点晚了,但我刚刚创建了一个 SkipAuthorizationAttribute 并将其添加到我的请求中。

      [AttributeUsage(AttributeTargets.Class)]
      public class SkipAuthorizationAttribute : Attribute
      {
      }
    
      [SkipAuthorization]
      public class Request
      {
        /// <summary>
        /// Gets or sets the current login user.
        /// </summary>
        [JsonIgnore]
        public ClaimsPrincipal User { get; set; }
      }
    

    然后在行为中,我检查了属性,如果找到则跳过。

        private bool ShouldSkip() =>
      Attribute.GetCustomAttribute(typeof(TRequest), typeof(SkipAuthorizationAttribute)) != null;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      相关资源
      最近更新 更多