我使用REST服务构建了一个简单的API应用程序。现在我在Azure App Service中启用了主体身份验证。我可以用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请求请求令牌?
我错过了什么吗?
干杯
答案 0 :(得分:2)
您无法使用客户端凭据从前端获取令牌。
相反,您必须使用隐式授权流程在重定向后在片段中获取访问令牌,或者将其从应用程序的后端传递到前端。
您可以在此处找到AngularJS应用示例:https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp。
另一种选择是不要从前端调用API,而是从后端调用它们。
错误的原因是Azure AD不允许使用CORS 。
顺便说一句,永远不要把你的客户秘密放在前端。