simpleSAMLphp 和 Azure 给了我 "AADSTS50011: The reply URL specified in the request does not match the reply URLs configured for the application"

simpleSAMLphp and Azure gives me "AADSTS50011: The reply URL specified in the request does not match the reply URLs configured for the application"

我是 Azure SSO 的新手,所以我可能在这里遗漏了一些明显的东西 - 请记住这一点 ;-)

我需要将我的应用程序集成到 Azure Active Directory。在我们的组织中没有太多帮助,所以我只能自己在这里找到问题:-/我的确切问题是,当我登录时,我从 Azure 收到此错误:

AADSTS50011: The reply URL specified in the request does not match the 
reply URLs configured for the application: 'https://192.168.0.1/secure/'.

我当然自己搜索了如何解决这个问题,但我没有找到任何可以让我更接近的东西。

我有这个设置:

我没有设置也无法访问 Azure 部分,因为这是由我们的 IT 人员设置的,但他们已经设置了:

Basic SAML Configuration

Identifier (Entity ID)                      : https://192.168.0.1/secure/
Reply URL (Assertion Consumer Service URL)  : https://192.168.0.1/secure/
Sign on URL                                 : Optional
Relay State                                 : Optional
Logout URL                                  : Optional

我从 Azure 收到了一个联合 XML 文件,并且 converted/populated 将其放入 simpleSAMLphp 文件 \metadata\saml20-idp-remote.php

我已经设置了 \config\authsources.php 文件:

'entityID'                   => "https://192.168.0.1/secure/",
'idp'                        => "https://sts.windows.net/06dg12k9-1wl2-4mue-79gh-40ff1a8dnd4a/",
'NameIDFormat'               => 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
'simplesaml.nameidattribute' => 'eduPersonTargetedID',

一切都已根据本指南进行配置,https://www.lewisroberts.com/2015/09/05/single-sign-on-to-azure-ad-using-simplesamlphp/

当我启动 https://192.168.0.1/simpleSAMLphp/www/ 并转到 AuthenticationTest configured authentication sources 并且我使用 [=78= 进行测试]default-sp 然后我会得到一个 Azure 登录屏幕。如果我为此查看 URL,那么它看起来像这样:

https://login.microsoftonline.com/0ad94219-6af5-474e-99d0-60f9188f3fce/saml2
    ?SAMLRequest=f[CUT]2Fy%2Fi%2Bjc%3D
    &RelayState=https%3A%2F%2F192.168.0.1%2FsimpleSAMLphp%2Fwww%2Fmodule.php%2Fcore%2Fauthenticate.php%3Fas%3Ddefault-sp

我假设 RelayState 是请求来自我的服务器的地方。我尝试将 Azure 中的 Entity IDReply URL 设置为 https://192.168.0.1/simpleSAMLphp/www/module.php/core/authenticate.php?as=default-sp,但结果相同。

所以我在这里提供了我所知道的一切,但我真的不知道如何解决这个问题?我是否需要在 simpleSAMLphp 中配置 Reply URL 以便它作为 URL 参数传递?

任何帮助将不胜感激。


### 更新 1 - 另一个问题###

从 simpleSAMLphp 修改日志文件后,它显示了发送到 Azure 的内容:

<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="_25e3fb2" Version="2.0"  Destination="https://login.microsoftonline.com/088f3fce/saml2" AssertionConsumerServiceURL="https://192.168.0.1/simpleSAMLphp/www/module.php/saml/sp/saml2-acs.php/default-sp" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST">
<saml:Issuer>https://192.168.0.1/simpleSAMLphp/www/module.php/saml/sp/metadata.php/default-sp</saml:Issuer>
<samlp:NameIDPolicy Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient" AllowCreate="true"/>
</samlp:AuthnRequest>

然后我从那里获取 AssertionConsumerServiceURL 并在 Azure 中将其用作 回复 URL。我还从 simpleSAMLphp 联合页面获取了 实体 ID 并且 现在 simpleSAMLphp 演示页面有效 :- )

所以我的 Azure 设置现在看起来像这样:

基本 SAML 配置

Identifier (Entity ID)                      : https://192.168.0.1/simpleSAMLphp/www/module.php/saml/sp/metadata.php/default-sp
Reply URL (Assertion Consumer Service URL)  : https://192.168.0.1/simpleSAMLphp/www/module.php/saml/sp/saml2-acs.php/default-sp
Sign on URL                                 : Optional
Relay State                                 : Optional
Logout URL                                  : Optional

(注意URL中的区别)

然而遗憾的是我仍然有问题。当我的网络范围内有一个 PHP 文件时,内容如下:

<?PHP
require_once ("../../simpleSAMLphp/lib/_autoload.php");
$as = new SimpleSAML_Auth_Simple('default-sp');
$as->requireAuth();

$attributes = $as->getAttributes();

echo '<pre>';
print_r($attributes);
echo '</pre>';

// Get a logout URL
$url = $as->getLogoutURL();
echo '<a href="' . htmlspecialchars($url) . '">Logout</a>';

?>

然后它以 无限循环 在我的服务器和 Azure 之间重定向结束!?查看日志对我没有任何重要的见解。似乎我确实从 Azure 接收到数据并且我通过了身份验证,因为我可以在调试日志中看到用户属性但是......如果我通过了身份验证那么为什么我会被重定向回 Azure!?


### 更新 2 - 解决方案###

在查看 simpleSAMLphp 日志文件并清除警告(它们实际上很重要)几个小时后,我发现我的无限重定向是由 [=123] 之间的不匹配引起的=] 会话和 simpleSAMLphp 会话。

我的解决方案是将两者对齐并在所有位置使用完全相同的设置。确保检查 php.ini 会话设置和 \config\config.php 会话设置并使它们相同。

我还发现我使用的 PHP 源代码是针对旧版本的 simpleSAMLphp,但我认为这不是问题。

代替这个旧方法: $as = new SimpleSAML_Auth_Simple('default-sp');

那么应该是这个新方法: $as = new \SimpleSAML\Auth\Simple('default-sp');

RelayState 只是一个按原样回显给您的 SP 的参数。例如,它可用于存储用户在身份验证之前尝试访问的页面url。

如果您使用 SAML2,回复 URL 应该是您在 SP 元数据中的 AssertionConsumerService url。 Azure 会将 SAML Response 发送到那里。如果 url 与 https://192.168.0.1/secure/ 不同,您将收到该错误。即使缺少尾随 / 也会导致错误。