我一直在使用MediatR Pipelines做以下事情(以相同的顺序)
对于第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命令,以便调用其处理程序,并跳过两者之间的授权处理程序?
答案 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;