首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跳过MediatR行为管道

跳过MediatR行为管道
EN

Stack Overflow用户
提问于 2019-07-04 13:06:13
回答 1查看 927关注 0票数 1

我一直在使用MediatR管道做以下事情(按相同的顺序)

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

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

代码语言:javascript
复制
public class Request
    {
        /// <summary>
        /// Gets or sets the current login user.
        /// </summary>
        [JsonIgnore]
        public ClaimsPrincipal User { get; set; }
    }

下面是一个示例MediatR查询对象。

代码语言:javascript
复制
 public class GetById : Request, IRequest<CompanyViewModel>
    {
        /// <summary>
        /// Gets or sets the Company Id.
        /// </summary>
        public int CompanyId { get; set; }
    }

以下是我在管道中的行为,在其中注入IHttpContextAccessor并获得索赔。

代码语言:javascript
复制
public class AttachContextUserPipelineBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
    where TRequest : Request

以下是我授权用户的管道行为。

代码语言:javascript
复制
public class AuthorizationPipelineBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
        where TRequest : Request

到目前为止,这还不错,但我现在几乎没有几个不需要授权的查询/命令对象(某种程度上是匿名的)。但是在这个方案中,我必须继承来自请求的查询/命令类,并定义一个授权管道处理程序。否则,将引发例外情况。

我如何才能拥有这样的方案,只需跳过/跳过授权管道,直接触发MediatR命令,以便调用它的处理程序,并在两者之间跳过授权处理程序?

EN

回答 1

Stack Overflow用户

发布于 2020-04-21 15:18:05

有点晚了,但我刚才所做的是创建一个SkipAuthorizationAttribute并将它添加到我的请求中。

代码语言:javascript
复制
  [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; }
  }

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

代码语言:javascript
复制
    private bool ShouldSkip() =>
  Attribute.GetCustomAttribute(typeof(TRequest), typeof(SkipAuthorizationAttribute)) != null;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56888642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档