【问题标题】:Microsoft.Identity.Web.UI works locally but not in App ServiceMicrosoft.Identity.Web.UI 在本地工作,但不适用于应用服务
【发布时间】:2021-09-15 02:56:17
【问题描述】:

我一直在尝试将身份验证添加到我的网络应用程序中:https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/master/1-WebApp-OIDC/1-1-MyOrg

如果我通过 dotnet run 使用 appsettings.Development.json 在本地运行,我可以按预期使用我的组织凭据登录。当我将容器化并部署到 Azure 中的 Web 应用程序时,我没有成功登录。浏览器中的 url 保持在 /signin-oidc 并从默认的 Razor pages 应用程序转到错误页面。

应用服务日志有消息说.AspNetCore.Correlation.OpenIdConnect.[key?] cookie not found

[更新] 身份验证流程适用于我的手机,但不适用于桌面。

  1. 为什么相同的代码可以在本地工作但不能部署?
  2. 为什么找不到 cookie?
  3. 为什么它可以在 iOS 而不是 Windows 上运行?

【问题讨论】:

  • 您是否在 azure 广告重定向 url 中添加了网络应用程序 url 信息?当你在本地机器上测试时,你应该使用像localhost:port/xxxx这样的url,在部署到azure之后你应该添加生产环境域。
  • 是的。做过某事。在我记得那个设置之前,错误是由于没有匹配的重定向而导致的身份验证失败。现在它一直到我的页面,但重定向 url 似乎没有被处理。我没有帐户操作控制器,因为我使用的是 Microsoft.Identity.Web.UI AddMicrosoftIdentityUI() 扩展。

标签: asp.net-core azure-web-app-service razor-pages microsoft-identity-platform microsoft-identity-web


【解决方案1】:

尝试在启动类中删除app.UseCookiePolicy();。 看看here

或者问题是IdentityServer仍在使用AddDeveloperSigningCredential

您可以在代码中添加证书,它将完美运行

参考here for more info

【讨论】:

  • 删除对 cookie 策略的引用并没有改变行为。在该示例中,我没有明确使用 IdentityServer。是否以某种方式在幕后注入?我的印象是 AAD 是身份服务器。
  • 请看here它可能有助于解决您的问题。
【解决方案2】:

tl;dr - 在身份验证设置中设置同站点 cookie 选项修复了此问题。

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(options =>
    {
        Configuration.Bind("AzureAd", options);
        options.NonceCookie.SameSite = SameSiteMode.Unspecified;
        options.CorrelationCookie.SameSite = SameSiteMode.Unspecified;
    });

这似乎是因为应用服务强制执行仅 TLS并且 处理 TLS 终止。因此,即使浏览器 URL 是 HTTPS,对应用程序的请求也始终是 HTTP。这会导致许多问题,第一个是重定向 URL 永远不会匹配,因为身份库使用请求方案来形成重定向 URL。我通过注入重定向 URL 重写“修复”了这个问题:

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(options =>
    {
        Configuration.Bind("AzureAd", options);
        options.Events ??= new OpenIdConnectEvents();
        options.Events.OnRedirectToIdentityProvider += _fixRedirect;
    });

...

private async Task _fixRedirect(RedirectContext context)
{
    context.Request.Scheme = "https";
    if(!context.ProtocolMessage.RedirectUri.StartsWith("https"))
        context.ProtocolMessage.RedirectUri = context.ProtocolMessage.RedirectUri.Replace("http", "https");
    await Task.CompletedTask;
}

但是,相关 cookie 似乎也使用相同的 HTTP 请求,因此当重定向返回时,HTTPS 不匹配。放宽 SameSiteMode 明确告诉浏览器(?)允许不同的方案。这就是为什么我的手机使用具有不同 cookie 策略的不同浏览器可以正常工作,而台式机却不能。使用 dev-certs 在本地运行允许方案匹配,因为应用终止 TLS 而不是应用服务。

我在调试过程中加入了CookiePolicyOptions.OnAppendCookie 事件以检查cookies。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    相关资源
    最近更新 更多