【发布时间】:2015-11-04 09:30:05
【问题描述】:
我使用 Simple Injector 作为我们的 Ioc 容器;我们有两个问题。
-
我们想注入我们的自定义身份验证过滤器;我们阅读了将属性转换为被动属性的帖子:Convert Attribute into a passive。但我们无法将自定义身份验证过滤器属性转换为被动属性。
public class BearerAuthentication : Attribute, IAuthenticationFilter { public async Task AuthenticateAsync( HttpAuthenticationContext context, CancellationToken cancellationToken) { } public Task ChallengeAsync( HttpAuthenticationChallengeContext context, CancellationToken cancellationToken) { } } -
我们想将依赖注入 OWin 中间件 OAuthAuthorizationServerProvider;我们知道我们可以使用开始执行上下文范围,但我们想要一个优雅的解决方案。
using (Ioc.Container.BeginExecutionContextScope()) { }
更新
public interface IAuthenticationFilter<TAttribute> where TAttribute : Attribute
{
Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken);
Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken);
}
public class BearerAuthenticationFilter : Attribute, IAuthenticationFilter<BearerAuthenticationFilter>
{
private readonly IAuthenticationBusinessEngine _authenticationBusinessEngine;
private readonly IHttpContextAccessor _httpContextAccessor;
public BearerAuthenticationFilter(IAuthenticationBusinessEngine authenticationBusinessEngine, IHttpContextAccessor httpContextAccessor)
{
_authenticationBusinessEngine = authenticationBusinessEngine;
_httpContextAccessor = httpContextAccessor;
}
public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
}
public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
}
public class AuthenticationFilterDispatcher : IAuthenticationFilter
{
private readonly Func<Type, IEnumerable> _container;
public AuthenticationFilterDispatcher(Func<Type, IEnumerable> container)
{
_container = container;
}
public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
{
var descriptor = context.ActionContext.ActionDescriptor;
var attributes = descriptor.ControllerDescriptor.GetCustomAttributes<Attribute>(true)
.Concat(descriptor.GetCustomAttributes<Attribute>(true));
foreach (var attribute in attributes)
{
var filterType = typeof(IAuthenticationFilter<>).MakeGenericType(attribute.GetType());
var filters = _container.Invoke(filterType);
foreach (dynamic actionFilter in filters)
{
await actionFilter.AuthenticateAsync(context, cancellationToken);
}
}
}
public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
public bool AllowMultiple
{
get
{
return true;
}
}
}
【问题讨论】:
-
“但我们无法将自定义身份验证过滤器属性转换为被动属性。”。为什么?
-
你好,史蒂文;我已经阅读了您关于被动属性的帖子,但在身份验证过滤器的情况下;该属性必须实现 IAuthenticationFilter 并且在您的帖子中您依赖于 OnActionExecuting 方法,但在我的情况下,AuthenticateAsync 和 ChallengeAsync 甚至在您的 ActionFilterDispatcher 之前运行
-
在这种情况下,您可以在所有其他过滤器之前创建一个在管道中注册的过滤器。此过滤器可以使用自己的 IAutFilter
. -
你能举个例子吗?
-
嗨史蒂文;我正在等待您的反馈
标签: asp.net-web-api dependency-injection action-filter simple-injector .net-attributes