gpt4 book ai didi

webforms - 在 SecurityTokenValidated 的 OpenId Connect OWIN 中间件中,HttpContext.Current 为空

转载 作者:行者123 更新时间:2023-12-04 17:31:38 25 4
gpt4 key购买 nike

我正在处理与 Azure AD 身份验证的 ASP.NET Web 窗体应用程序中的 OpenId Connect 中间件 (OWIN) 相关的错误。我是 OWIN 和 OpenID 的新手,并没有编写这段代码,所以请多多包涵。

该解决方案已经过测试,看起来工作正常,但一旦投入生产,我们看到多个空引用异常,这是由于调用 SecurityTokenValidated 通知中间件时 HttpContex.Current 为空。

在用户尝试登录生产环境时,大约 30%-40% 的时间会出现此问题。我们最初无法在本地重现该问题,但我们最终发现,通过将 Chrome 中的网络速度设置为快速/慢速 3G 速度(足够有趣),我们可以 100% 地重现问题。

这是我们在 Startup.cs 类中配置中间件的代码:

[assembly: OwinStartup(typeof(Namespace.Startup))]
namespace Namespace
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
var openIdConnectProvider = OpenIdConnectProviderDAO.GetOpenIdConnectProviders().Single(x => x.ClientId == "ClientIdHere");
app.Use((context, next) =>
{
var httpContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);
httpContext.SetSessionStateBehavior(SessionStateBehavior.Required);
return next();
});

app.UseStageMarker(PipelineStage.MapHandler);
app.SetDefaultSignInAsAuthenticationType(OpenIdConnectAuthenticationDefaults.AuthenticationType);
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = openIdConnectProvider.ClientId,
Authority = openIdConnectProvider.Authority,
RedirectUri = ConfigurationHelper.GetAppSetting("applicationRoot").ToLower(),
AuthenticationType = openIdConnectProvider.Key,
AuthenticationMode = AuthenticationMode.Passive,
ResponseType = OpenIdConnectResponseType.IdToken,
Scope = OpenIdConnectScope.Email,
TokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = openIdConnectProvider.ValidIssuer,
ValidateIssuer = true,
ValidAudience = openIdConnectProvider.ClientId,
ValidateAudience = true
},
Notifications = new OpenIdConnectAuthenticationNotifications
{
SecurityTokenValidated = OnSecurityTokenValidated,
AuthenticationFailed = OnAuthenticationFailed
}
});
}

private Task OnSecurityTokenValidated(SecurityTokenValidatedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> arg)
{
// This is null when connection speed is set to Slow/Fast 3G
var context = HttpContext.Current;

return Task.FromResult(0);
}

private Task OnAuthenticationFailed(AuthenticationFailedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> context)
{
context.HandleResponse();
context.Response.Redirect("Login.aspx");

return Task.FromResult(0);
}
}
}

我们需要访问 HttpContext.Current 才能访问 SecurityTokenValidated 中间件中的 Session。所以我们按照这些帖子中的建议添加了中间件:

Can OWIN middleware use the http session?

HttpContext.Current.Session is null + OWIN

这看起来很有效,直到问题开始在生产中出现。

我尝试在各种 PipelinesStages(Authenticate、PostAcquireState 等)中使用 UseStageMarker 的各种组合,但它们都不起作用。

任何帮助将不胜感激!

最佳答案

有同样的问题,遇到了这个链接。我在 github 上找到了解决问题的方法.

基本上,在 Global.asax 上添加一个空的 Session_OnStart() 方法

希望它能帮助其他人遇到这个问题。

关于webforms - 在 SecurityTokenValidated 的 OpenId Connect OWIN 中间件中,HttpContext.Current 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59179483/

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