我一直在使用MediatR管道做以下事情(按相同的顺序)
对于步骤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; }
}以下是我在管道中的行为,在其中注入IHttpContextAccessor并获得索赔。
public class AttachContextUserPipelineBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
where TRequest : Request以下是我授权用户的管道行为。
public class AuthorizationPipelineBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
where TRequest : Request到目前为止,这还不错,但我现在几乎没有几个不需要授权的查询/命令对象(某种程度上是匿名的)。但是在这个方案中,我必须继承来自请求的查询/命令类,并定义一个授权管道处理程序。否则,将引发例外情况。
我如何才能拥有这样的方案,只需跳过/跳过授权管道,直接触发MediatR命令,以便调用它的处理程序,并在两者之间跳过授权处理程序?
发布于 2020-04-21 15:18:05
有点晚了,但我刚才所做的是创建一个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;https://stackoverflow.com/questions/56888642
复制相似问题