跳过MediatR行为管道

时间:2019-07-04 13:06:13

标签: c# asp.net-core mediatr

我一直在使用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

到目前为止,还不错,但是现在我的Query / Command对象很少,不需要授权(有点允许匿名)。但是在这种情况下,我必须从Request继承Query / Command类,还必须定义一个Authorization Pipeline Handler。否则,将引发异常。

我该如何处理这种情况,并跳过/跳过授权管道,直接触发MediatR命令,以便调用其处理程序,并跳过两者之间的授权处理程序?

1 个答案:

答案 0 :(得分:2)

有点晚了,但是我刚刚做的是创建一个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;