java AADSTS500112:请求授权代码时,回复地址“http://testurl”与回复地址“https://testurl”不匹配

pftdvrlh  于 11个月前  发布在  Java
关注(0)|答案(3)|浏览(195)

我正在尝试将Java应用程序与Azure广告集成。
我已经在azure注册了一个应用程序并添加了重定向url,成功登录后,它被重定向到我的java应用程序,我正在使用msal库获取授权代码。
获取下面的异常
com.microsoft.aad.msal4j.MsalServiceException:AADSTS500112:返回地址
http://testUrl”与答复地址“https://testUrl”不匹配
我在上面的URL中看到的唯一区别是http和https,即使我在应用程序注册中的重定向URL以及Microsoft登录URL中的redirect_uri中都提到了https。
顺便说一句,它在我的本地环境中工作,当我在服务器上托管它时不工作。

jaxagkaj

jaxagkaj1#

在部署到生产环境中后,我们也遇到了同样的问题。https变成http的原因是,由于我处于负载平衡环境中,外部URL与内部URL不同(负载均衡器卸载了SSL处理)。当来自azure的http请求到达我们的web过滤器时,httpRequest.getRequestURL().toString()获取http而不是https。我们所做的是,要求devops团队在httprequest中添加一个header,并将原始URL发送到负载均衡器,在我们的代码中,我们提取http header而不是http请求本身。
具体来说,改变

String currentUri = httpRequest.getRequestURL().toString();

字符串

String currentUri = httpRequest.req.getHeader(HEADER_PROXY_URL);


HEADER_PROXY_URL是devops注入原始url的头文件名。

iyzzxitl

iyzzxitl2#

根据我的研究,Web应用和服务的重定向URL必须开始以方案https开头。如果你想使用方案http,你可以使用http:\\localhost。更多详细信息,请参阅https://learn.microsoft.com/en-us/azure/active-directory/develop/azure-ad-endpoint-comparison#restrictions-on-redirect-urls

xwbd5t1u

xwbd5t1u3#

wty1127提到的负载均衡器与我遇到的问题相同,但wty1127使用的是Java,而我使用的是.NET Core。以下是我在Program.cs中所做的更改:
之前:

.EnableTokenAcquisitionToCallDownstreamApi()
    .AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftGraph"))
    .AddInMemoryTokenCaches();

字符串
之后:

.EnableTokenAcquisitionToCallDownstreamApi(options =>
{
    var section = builder.Configuration.GetSection("AzureAd");
    options.RedirectUri = section.GetValue<string>("RedirectUri") + section.GetValue<string>("CallbackPath");
})
    .AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftGraph"))
    .AddInMemoryTokenCaches();


这会将Microsoft Graph的重定向URI设置为实际部署的位置,而不是自动检测到的错误位置。重定向URI从我的appsettings.json中获取,其中包含以下内容:

{
  "MicrosoftGraph": {
    "BaseUrl": "https://graph.microsoft.com/v1.0",
    "Scopes": "user.read"
  },
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "my.domain.example.com",
    "Scopes": "access_as_user",
    "ClientCertificates": [],
    "TenantId": "example-guid-here",
    "ClientId": "example-guid-here",
    "ClientSecret": "example-secret-here",
    "RedirectUri": "https://url-of-my-deployed-website.example.com",
    "CallbackPath": "/signin-oidc",
    "SignedOutCallbackPath": "/signout-callback-oidc"
  }
}


所以代码只是设置options.RedirectUri = "https://url-of-my-deployed-website.example.com/signin-oidc"。这解决了我的问题。

相关问题