无法让App Service CDN使用身份验证

时间:2017-11-03 15:18:49

标签: azure openid-connect azure-web-app-service azure-cdn

我有一个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";

1 个答案:

答案 0 :(得分:0)

在挖了一下后,我找到了答案。

OpenIdConnectOptions.Events属性允许您挂钩在整个身份验证生命周期中发生的各种事件。一个回调称为OnRedirectToIdentityProvider。它提供RedirectContext。在该对象上,您可以读取/写入名为ProtocolMessage.RedirectUri的属性。该属性允许您指定一个完整的URL,当用户转发到AAD时,该URL用作return_url

值得注意的是,我正在使用Nuget的Microsoft.AspNetCore.Authorization.OpenIdConnect包装。还有其他可用的包提供类似的功能,允许您在选项对象中设置完整的URL。