为什么我收到错误 AADSTS50011:请求中指定的回复 url 与为应用程序配置的回复 url 不匹配?

Why am I getting the error AADSTS50011: The reply url specified in the request does not match the reply urls configured for the application?

我知道之前有人问过这个问题,但到目前为止我所读的内容似乎都无法解决问题。当我尝试 运行 我的 ASP.NET 核心应用程序收到以下错误消息。

AADSTS50011: The reply URL specified in the request does not match the reply URLs configured for the application

我已经使用 Azure 门户给我的指南设置了我的身份验证。我会告诉你我目前拥有的东西。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options => {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });
    services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
        .AddAzureAD(options => Configuration.Bind("AzureAd", options));

    services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
    {
        options.Authority = options.Authority + "/v2.0/";
        options.TokenValidationParameters.ValidateIssuer = false;
    });
    services.AddAuthorization(options =>
    {
        options.AddPolicy("NorwayTeam", policyBuilder => policyBuilder.RequireClaim("groups", "111-222-333-444-555"));
    });            

    //MVC
    services.AddMvc(options => {
        var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
        options.Filters.Add(new AuthorizeFilter(policy));
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
            .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

    ...[shortened for brevity]
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseAuthentication();
    app.UseSignalR(routes =>
    {
        routes.MapHub<ChatHub>("/chatHub");
        routes.MapHub<VesselHub>("/vesselHub");
        routes.MapHub<RequirementHub>("/requirementHub");
    });
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

我也把相关代码放在我的 appsettings.json

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "MyCompany.onmicrosoft.com",
    "TenantId": "xxx",
    "ClientId": "xxx",
    "CallbackPath": "/signin-oidc"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

因此,从应用程序的角度来看,以上代码是连接到我的应用程序注册所需的全部。显然,我在相关控制器中放置了 [Authorize]

下一步是在我的 Azure 门户中设置应用程序注册。我将我的应用程序注册设置更改为以下内容,模糊区域使用我的网络应用程序的 URL,即 https://MyCompany.azurewebsites.net/。因为这是我的应用程序的生产版本,所以我不想使用 localhost.

部分我认为问题可能与流氓本地主机声明有关,但我不能确定,因为我看不到应用程序对应用程序注册发出的请求。有谁知道我做错了什么?

这个问题很容易定位,当您访问您的应用程序url(https://MyCompany.azurewebsites.net/)时,您将被重定向到登录页面。

解码授权请求url,你会发现redirect_uri。

有点像

https://login.microsoftonline.com/XXX/oauth2/authorize?client_id=XXX&redirect_uri=http://localhost:59775/signin-oidc&response_type=id_token&scope=openid profile

复制 redirect_uri 的值并将其粘贴到 Azure 门户,然后重试。

我设法解决了这个问题。在所有这些设置过程中,我没有意识到的是,Azure 中的单个应用程序注册可以为 localhost 和您的 production 注册多个 return URL环境。

为了使这个应用程序正常工作并克服错误,我只是为 productionstaging 添加了一个额外的 URL 设置到应用程序注册,从而使我能够进行身份验证在所有途径上。请看下面。

就我而言,我在浏览器中输入:

mysite.azurewebsites.net

但是 Chrome 正在用 http 完成 url。当我手动输入时:

https://mysite.azurewebsites.net

问题解决了。