我有一个ASP.NET Core应用程序,该应用程序使用Azure Active Directory B2C进行身份验证,并将其部署到Google App Engine实例中。在AD B2C的应用程序配置中,我将Internal/everyone
作为重定向URL,但是当我登录时,出现错误https://<domain>/signin-oid
,说域AADB2C90006
无效。我在代码中的任何地方都没有指定该网址的http://<domain>/signin-oid
版本。
我尝试在我的开发环境中本地运行此程序,它可以按预期运行。我了解Nginx在启动的Kestrel实例之前充当代理,并且我已在Kestrel实例中配置SSL以使用App Engine实例使用的同一证书。我之所以这么说是因为我怀疑App Engine和Kestrel配置之间存在某种脱节,尽管对于问题可能出在哪里还是很模糊的。
http
我的 return new WebHostBuilder()
.ConfigureKestrel((context, options) =>
{
if (!string.IsNullOrEmpty(aspEnv) && !string.Equals(aspEnv,"Development"))
{
options.ListenAnyIP(443,opt => opt.UseHttps("myfile.pfx","mypass"));
}
})
函数中也有以下一行:
Configure
答案 0 :(得分:0)
好吧,我仍然不知道为什么会http:
而不是https:
,但是我确实有针对性的解决方法。
在我的项目中,我有一个名为OpenIdConnectOptionsSetup
的类,它是从Azure AD B2C sample中学到的。在此类中,我配置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成功登录到我的站点。
答案 1 :(得分:0)
在Linux上将.NET Core应用程序部署到Azure应用服务时,我遇到了同样的问题。通过转发this answer中指定的XForwardedProto
中的Startup.cs
标头,可以解决此问题。