【问题标题】:Azure Service principal authentication for API AppAPI 应用的 Azure 服务主体身份验证
【发布时间】:2017-07-26 05:46:16
【问题描述】:

我已经使用 REST 服务构建了一个简单的 API 应用程序。现在,我已在 Azure 应用服务中启用主体身份验证。我可以通过 C# 代码获取我的不记名令牌:

public static AuthenticationResult GetS2SAccessTokenForProdMSA()
{
        return GetS2SAccessToken(authority, resource, clientId, clientSecret);
}

static AuthenticationResult GetS2SAccessToken(string authority, string resource, string clientId, string clientSecret)
{
        var clientCredential = new ClientCredential(clientId, clientSecret);
        AuthenticationContext context = new AuthenticationContext(authority, false);
        AuthenticationResult authenticationResult = context.AcquireTokenAsync(resource, clientCredential).Result;
        return authenticationResult;
}

如果我想通过 JavaScript 获取我的不记名令牌,例如:

$.ajax({
    url: 'https://login.microsoftonline.com/1640e15a-2d4c-4903-8b89-a00c52ac3c17/oauth2/token',
    type: 'POST',
    crossOrigin: true,
    data: 'resource=https://foobar' +
                '&client_id=68b9a002-d6f9-4732-9c9c-893b2c60ba42' +
                '&client_secret=<secret>' +
                '&grant_type=client_credentials',
    contentType: 'application/x-www-form-urlencoded',
    success: function (returndata) {
        alert(formData);
    },
    error: function (errordata) {
        alert(errordata.statusText);
    }
});

我在 Chrome 中收到一条错误消息:

请求中没有“Access-Control-Allow-Origin”标头 资源

但在 Fiddler 中,我可以使用不记名令牌看到成功的答案(在 Firefox 中同样的错误,但在 IE 11 中没有)。

为什么无法通过 AJAX 请求请求令牌?

我错过了什么吗?

干杯

【问题讨论】:

标签: c# rest azure oauth adal


【解决方案1】:

您无法使用客户端凭据从前端获取令牌。

相反,您必须使用隐式授权流在重定向后获取片段中的访问令牌,或将其从应用后端传递到前端。

在这里您可以找到一个示例 AngularJS 应用程序:https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp

另一种选择是不从前端调用 API,而是从后端调用它们。

错误原因是 Azure AD 不允许 CORS

顺便说一句,永远不要把你的客户机密放在前端。

【讨论】:

  • 感谢您的支持!从没有 Azure AD 身份验证的网页调用 Azure API App WebService 的最佳做法是什么?网页是公开的,但 WebService 调用应该作为一种服务用户来调用。
  • 您的前端可以在其后端调用公共端点。然后,端点可以通过客户端凭据流(客户端 ID + 客户端密码)向 Azure AD 进行身份验证,并使用访问令牌调用 Web 服务。这样,您的客户机密就会保密,您可以控制可以执行的操作。您可以缓存访问令牌+刷新令牌,这样您就不需要每次都从后端进行身份验证。 ADAL 可以很好地为您做到这一点。
猜你喜欢
  • 1970-01-01
  • 2016-07-26
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 2018-11-03
  • 1970-01-01
相关资源
最近更新 更多