我有一个asp.net核心Web应用程序作为应用程序服务托管在azure中。我已将应用程序配置为使用OpenId Connect与Azure AD作为权限。身份验证发生在我的应用程序中(我没有配置应用程序服务本身来处理身份验证)。
当我直接点击应用服务时(或者即使我使用自定义域名),一切正常。
我已在应用服务中启用了CDN服务。初始传播完成后,我打开浏览器并导航到CDN地址([name] .azureedge.net)。
我获得了重定向到Azure AD,但是一旦我完成身份验证过程,我就会收到错误。
看起来当从ADN重定向到Azure AD时,应用服务的URL被设置为return_url
。因此,当Azure AD重定向我时,我不再访问CDN。当重定向到Azure AD时,我的浏览器中放置了一个cookie;我怀疑我的网站正在寻找那个cookie,但是浏览器没有发送它,因为它是由不同的域设置的。
我已尝试将OpenIdConnectOptions中的CallbackPath配置为完整的URL(架构,主机,域等),但是当我的应用程序初始化时,会抛出错误,指出路径必须以&#39开头; /' (大概是它期望从请求中域的根路径开始)。
希望其他人遇到过这个问题并告诉我我做错了什么。
根据请求,这是我的OIDC配置:
var openIdOptions = new OpenIdConnectOptions
{
ClientId = adSettings.ClientId,
ClientSecret = adSettings.ClientSecret,
Authority = adSettings.Authority,
CallbackPath = adSettings.CallbackPath,
ResponseType = OpenIdConnectResponseType.CodeIdToken,
Events = new OpenIdConnectEvents { OnTicketReceived = AddApplicationRolesToUserClaimsAsync, OnAuthorizationCodeReceived = RedeemCodeAsync }
};
foreach (var scope in adSettings.Scopes.Concat(settings.MicrosoftGraph.Scopes))
openIdOptions.Scope.Add(scope);
application.UseOpenIdConnectAuthentication(openIdOptions);
adSettings是一个POCO,由以下appsettings.json补充:
"AzureAd": {
"AADInstance": "https://login.microsoftonline.com/",
"ClientSecret": "REDACTED",
"CallbackPath": "/signin-oidc",
"ClientId": "REDACTED",
"TenantId": "REDACTED",
"Scopes": [
"openid",
"profile",
"offline_access"
]
}
adSettings.Authority
在POCO中定义为:
public string Authority => $"{AADInstance}{TenantId}/v2.0";
答案 0 :(得分:0)
在挖了一下后,我找到了答案。
OpenIdConnectOptions.Events
属性允许您挂钩在整个身份验证生命周期中发生的各种事件。一个回调称为OnRedirectToIdentityProvider
。它提供RedirectContext
。在该对象上,您可以读取/写入名为ProtocolMessage.RedirectUri
的属性。该属性允许您指定一个完整的URL,当用户转发到AAD时,该URL用作return_url
。
值得注意的是,我正在使用Nuget的Microsoft.AspNetCore.Authorization.OpenIdConnect
包装。还有其他可用的包提供类似的功能,允许您在选项对象中设置完整的URL。