我有一个 ASP.NET Core 应用程序,它使用 Azure Active Directory B2C 进行身份验证,并将其部署到 Google App Engine 实例中。在 AD B2C 中的应用程序配置中,我将
https://<domain>/signin-oid
作为重定向 URL,但是当我登录时,出现错误 AADB2C90006
,指出域 http://<domain>/signin-oid
无效。我的代码中没有指定此网址的 http
版本。
我尝试在我的开发环境中本地运行它,它按预期工作。据我所知,Nginx 在启动的 Kestrel 实例之前充当代理,并且我已在 Kestrel 实例中配置 SSL 以使用 App Engine 实例使用的相同证书。我提到这一点是因为我怀疑 App Engine 和 Kestrel 配置之间存在某种脱节,尽管问题可能出在哪里还很模糊。
return new WebHostBuilder()
.ConfigureKestrel((context, options) =>
{
if (!string.IsNullOrEmpty(aspEnv) && !string.Equals(aspEnv,"Development"))
{
options.ListenAnyIP(443,opt => opt.UseHttps("myfile.pfx","mypass"));
}
})
我的
Configure
函数中也有这一行:
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
好吧,我仍然不知道为什么会出现
http:
而不是 https:
,但我 do 有一个解决办法。
在我的项目中,我有一个名为
OpenIdConnectOptionsSetup
的类,它是我从 Azure AD B2C 示例 中选取的。在本课程中,我配置了 OpenIdConnectEvents
,其中包括一个 OnRedirectToIdentityProvider
委托,其中我有一些代码寻找 http:
,但隐藏在 if
语句中,寻找身份验证策略中的差异,我还没有看到这些代码接到电话,但我离题了。
我的代表现在看起来像这样:
public Task OnRedirectToIdentityProviderAsync(RedirectContext context)
{
Logger.LogInformation($"redirect URI for B2C: {context.ProtocolMessage.RedirectUri} !!!!!!!");
if (context.ProtocolMessage.RedirectUri.Contains("http:"))
{
Logger.LogInformation("http: found in RedirectUri, replacing with https");
context.ProtocolMessage.RedirectUri = context.ProtocolMessage.RedirectUri.Replace("http:", "https:");
}
//in case of error, show us the problem
if (string.IsNullOrEmpty(context.ProtocolMessage.ErrorUri))
{
Logger.LogInformation("ErrorUri is empty! replacing with ErrorUri property.");
context.ProtocolMessage.ErrorUri = GCPSettings.ErrorUri;
}
}
使用此配置,我能够使用 Azure AD B2C 成功登录到我的站点。
在 Linux 上将 .NET Core 应用程序部署到 Azure 应用服务时,我遇到了同样的问题。我能够通过转发
XForwardedProto
中的Startup.cs
标头来解决这个问题,如这个答案中指定的那样。
如果您使用的是 Azure 应用服务(Linux 容器),只需设置以下环境变量:“ASPNETCORE_FORWARDEDHEADERS_ENABLED”=true