我已经阅读了有关此问题的所有其他帖子,并且确定这不是重复的。
我正在构建要在我的Startup.cs
课程中使用的Razor页面过滤器,我需要访问HttpContext
。我通常会使用ASP.NET Core的DI功能通过构造函数注入来做到这一点。我什至拥有通常的services.AddHttpContextAccessor()
声明,Startup.cs
并在项目的其他地方使用它。
由于我正在建立一个Razor页面过滤器,该页面过滤器IAsyncPageFilter
是从派生的,并且是从Startup.cs
该类创建的,因此似乎无法注入它(因为它是由启动创建的,而不是注入的)。
这是过滤器添加到Startup.cs
:
services.AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
options.Filters.Add(new RazorAsyncPageFilter(_logger, Configuration)); <---my filter
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
这是我的过滤器:
public class RazorAsyncPageFilter : IAsyncPageFilter
{
private readonly ILogger _logger;
private readonly IConfiguration _configuration;
public string[] Scopes { get; set; }
public string ScopeKeySection { get; set; }
public RazorAsyncPageFilter(ILogger logger, IConfiguration configuration)
{
_logger = logger;
_configuration = configuration;
}
public async Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
{
await Task.CompletedTask;
}
public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
{
VaultGraphServiceClient.OnMsalUiExceptionEvent += VaultGraphServiceClientOnOnMsalUiExceptionEvent;
await next.Invoke();
}
private void VaultGraphServiceClientOnOnMsalUiExceptionEvent(object sender, MsalUiRequiredException e)
{
_logger.LogInformation($"Triggered authentication exception: {e.Message}");
Scopes = new string[] { _configuration.GetValue<string>(ScopeKeySection) };
var properties = BuildAuthenticationPropertiesForIncrementalConsent(Scopes, e, **I_NEED_CONTEXT_HERE**);
new ChallengeResult(properties);
}
}
请注意从另一个类的事件处理程序触发的方法调用中需要的上下文。我想将传递HttpContext
给filter类中的private方法。
在Startup.cs
for中定义一个字段IHttpContextAccessor _httpContext
并将其传递给过滤器,但是由于该上下文尚未建立,因此这显然不起作用。
通过其他方法传递上下文。这还需要更多工作,并且充满了有关将其传递给后台线程的警告。
从我的呼唤中注入语境EventHandler
。不幸的是,这是从静态类中调用的,并且据我了解,静态类中没有DI的概念。这个对吗?另外,我正在使用一个EventHandler
委托,该委托用于传递MsalUiRequiredException
对象,并且只能传递一个对象。也许我可以为该event
类型使用其他处理程序,但是我对事件不够熟悉,无法理解如何实现。
我正在考虑创建一个自定义类,以容纳MsalUiRequiredException
和HttpContext
可以在其他地方注入/传递它的位置,但这似乎有点过头,或者可能是上述#2的问题。
有什么建议?
添加IHttpContextAccessor
为构造函数参数
public RazorAsyncPageFilter(ILogger logger, IConfiguration configuration, IHttpContextAccessor httpContext)
{
_logger = logger;
_configuration = configuration;
_httpContext = httpContext;
}
并按类型添加过滤器
options.Filters.Add<RazorAsyncPageFilter>()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句