gpt4 book ai didi

c# - Mediatr 3.0 使用管道行为进行身份验证

转载 作者:可可西里 更新时间:2023-11-01 09:07:58 26 4
gpt4 key购买 nike

着眼于使用新的 Mediatr 3.0 功能管道行为进行身份验证/授权。

您通常会根据消息或处理程序进行身份验证吗?我问的原因是我对处理程序进行了授权(与 MVC 中的 Controller 相同),但行为似乎不了解处理程序,所以我不确定这是否可能/合适。

我可以为每条消息添加一个 IAuthorisationRequired 标记接口(interface),但是如果消息是一个通知/事件并且有多个处理程序,那么也许应该运行一些处理程序而不是其他处理程序。在执行实际工作的处理程序代码上检查身份验证确实感觉更好。

希望能够在处理程序上放置一个 [Authorize] 属性,并使用一个行为来检查它(我目前正是这样做的,但使用的是基类而不是行为)。

public class AuthenticationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
{
public Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next)
{
//Can't access handler class here, so how do I know the action requires authentication/authorization?
return next();
}
}

[Authorize]
public class ChangePasswordRequestHandler : IAsyncRequestHandler<ChangePassword, ReponseType>
{
protected override async Task<ReponseType> Handle(AsyncRequestBase<ChangePassword> message)
{
//change users password here
}
}

最佳答案

你是对的,RequestDelegateHandler<TResponse>不会暴露接下来要运行的处理程序,这是故意的。如果您考虑一下,MediatR 2.x 中的管道使用装饰器,而装饰器可以访问被装饰者的实例,我建议不要基于它进行身份验证。原因是,如果您需要您的授权装饰器来装饰处理程序的一个特定实例——用特定属性装饰的那个——那么它们是耦合的,这违背了装饰器的目的,您应该能够将它们放在每个处理程序的顶部其他独立。

这就是为什么我建议至少在大多数情况下基于消息进行授权。您可以有一个可扩展的设计,其中每条消息都与多个授权规则相关联,并且一个行为会评估所有这些规则。

public interface IAuthorizationRule<TRequest>
{
Task Evaluate(TRequest message);
}

public class AuthorizationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
{
private readonly IAuthorizationRule<TRequest>[] _rules;

public AuthorizationBehavior(IAuthorizationRule<TRequest>[] rules)
{
_rules = rules;
}

public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next)
{
// catch it or let it bubble up depending on your strategy
await Task.WaitAll(_rules.Select(x => x.Evaluate(request)));

return next();
}
}

对于您提到的特定情况,对于通知,某些处理程序可能运行而其他处理程序不应该运行,您始终可以使用针对该特定消息的授权行为,并将它们选择性地应用于需要它们的处理程序。我想我的意思是,当您遇到这些特定场景时,您将不得不自己动手制作一些东西。

关于c# - Mediatr 3.0 使用管道行为进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41539872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com