从已发布的 Azure 函数发布请求时令牌访问被阻止
Token access blocked when posting request from published Azure function
我正在努力通过 post 请求从“https://login.microsoftonline.com/common/oauth2/token”获取带有 Azure 函数的令牌。该令牌将授予通过 CSOM 访问 SharePoint 的权限。这是我的带有 post 请求的代码片段:
var clientId = defaultAADAppId;
var body = $"resource={resource}&client_id={clientId}&grant_type=password&username={HttpUtility.UrlEncode(username)}&password={HttpUtility.UrlEncode(password)}";
using (var stringContent = new StringContent(body, Encoding.UTF8, "application/x-www-form-urlencoded"))
{
var result = await httpClient.PostAsync(tokenEndpoint, stringContent);
var tokenResult = JsonSerializer.Deserialize<JsonElement>(result);
var token = tokenResult.GetProperty("access_token").GetString();
}
在本地测试时,运行 Visual studio 中的函数和尝试使用 Postman 时,我都能获得访问令牌。但是,一旦我将函数发布到 Azure 中的函数应用程序,我就会收到以下错误消息:
“AADSTS53003:条件访问策略已阻止访问。访问策略不允许颁发令牌”
我已经在门户中启用了应用程序注册,如前所述,在我将所有内容发布到 Azure 之前一切正常。
关于如何解决这个问题有什么想法吗?
如错误消息所述,您的应用被 CA 策略阻止。 可能的原因可能是未知的客户端应用、阻止外部 IP 地址等。
您可以执行以下解决方法之一:
- 将您的客户端应用程序添加到您的 CA 策略。
- 我不推荐这样做,因为这会影响您的安全 - 如果您愿意冒险,您可以从您的 CA 策略中排除“Microsoft Azure Management”,它会阻止未知客户端/需要设备状态并仍然保护登录与 MFA。
- 更好的方法是使用另一个 OAuth 2.0 和 OpenID 连接流程,如您在应用程序中直接登录的委托流程(如果可能)。
我现在可以使用它了。首先,我按照@CaseyCrookston 的建议审查了 CA 政策。我发现我们的 CA 政策阻止了我们运营所在国家/地区以外的电话。但是,来自 App registration/Azure 函数的调用是从 Azure 数据中心位置注册的,因此被我们的 CA 策略阻止。当 运行 他们在本地调用在我的国家/地区注册时,因此在调试时没有显示错误。
我的第一步是尝试将我的客户端应用程序添加到 CA 策略,但这是不可能的。我根据CSOM guide by Microsoft prevented the App registration to be whitelisted from the CA policies (Github issue).
中的建议使用的client/secret身份验证
基于此,我不得不按照此处的建议将身份验证更改为基于证书的身份验证:Access token request with a certificate and here: SO answer。有了这个,我能够在 CA 策略中将应用程序注册列入白名单,并成功向 Sharepoint CSOM 进行身份验证。
我正在努力通过 post 请求从“https://login.microsoftonline.com/common/oauth2/token”获取带有 Azure 函数的令牌。该令牌将授予通过 CSOM 访问 SharePoint 的权限。这是我的带有 post 请求的代码片段:
var clientId = defaultAADAppId;
var body = $"resource={resource}&client_id={clientId}&grant_type=password&username={HttpUtility.UrlEncode(username)}&password={HttpUtility.UrlEncode(password)}";
using (var stringContent = new StringContent(body, Encoding.UTF8, "application/x-www-form-urlencoded"))
{
var result = await httpClient.PostAsync(tokenEndpoint, stringContent);
var tokenResult = JsonSerializer.Deserialize<JsonElement>(result);
var token = tokenResult.GetProperty("access_token").GetString();
}
在本地测试时,运行 Visual studio 中的函数和尝试使用 Postman 时,我都能获得访问令牌。但是,一旦我将函数发布到 Azure 中的函数应用程序,我就会收到以下错误消息:
“AADSTS53003:条件访问策略已阻止访问。访问策略不允许颁发令牌”
我已经在门户中启用了应用程序注册,如前所述,在我将所有内容发布到 Azure 之前一切正常。
关于如何解决这个问题有什么想法吗?
如错误消息所述,您的应用被 CA 策略阻止。 可能的原因可能是未知的客户端应用、阻止外部 IP 地址等。
您可以执行以下解决方法之一:
- 将您的客户端应用程序添加到您的 CA 策略。
- 我不推荐这样做,因为这会影响您的安全 - 如果您愿意冒险,您可以从您的 CA 策略中排除“Microsoft Azure Management”,它会阻止未知客户端/需要设备状态并仍然保护登录与 MFA。
- 更好的方法是使用另一个 OAuth 2.0 和 OpenID 连接流程,如您在应用程序中直接登录的委托流程(如果可能)。
我现在可以使用它了。首先,我按照@CaseyCrookston 的建议审查了 CA 政策。我发现我们的 CA 政策阻止了我们运营所在国家/地区以外的电话。但是,来自 App registration/Azure 函数的调用是从 Azure 数据中心位置注册的,因此被我们的 CA 策略阻止。当 运行 他们在本地调用在我的国家/地区注册时,因此在调试时没有显示错误。
我的第一步是尝试将我的客户端应用程序添加到 CA 策略,但这是不可能的。我根据CSOM guide by Microsoft prevented the App registration to be whitelisted from the CA policies (Github issue).
中的建议使用的client/secret身份验证基于此,我不得不按照此处的建议将身份验证更改为基于证书的身份验证:Access token request with a certificate and here: SO answer。有了这个,我能够在 CA 策略中将应用程序注册列入白名单,并成功向 Sharepoint CSOM 进行身份验证。