0

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

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

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

[更新] 身份验证流程在我的手机上有效,但在桌面上无效。

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

2 回答 2

0

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

或者问题IdentityServer还在使用AddDeveloperSigningCredential

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

请参阅此处了解更多信息

于 2021-09-14T06:45:15.277 回答
0

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在调试时加入了事件以检查 cookie 以找出这一点。

于 2021-09-14T18:56:17.063 回答