无法使用不记名令牌访问 AAD-secure Web API
Unable to use bearer token to access AAD-secure Web API
我有一个使用 Azure AD (AAD) 保护的 API 应用程序。我还有一个用于消费应用程序的 AAD 应用程序,并且在消费应用程序中我设置了访问 API 应用程序的权限。
我可以获得令牌,但是当我去使用令牌时,API 应用程序似乎没有查看授权 header。它试图通过网络浏览器让我登录。
我的请求是这样的:
GET /api/ticketing/issueTopics HTTP/1.1
Host: <removed>
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc<rest is removed>
Cache-Control: no-cache
This is what my Fiddler looks like.
我在 Postman 中得到的结果是一些 MS 重定向页面:
<html>
<head>
<title>Working...</title>
</head>
<body>
<form method="POST" name="hiddenform" action="<removed>/.auth/login/aad/callback">
<input type="hidden" name="id_token" value="<bearer token removed>" />
<input type="hidden" name="state" value="/api/ticketing/issueTopics" />
<input type="hidden" name="session_state" value="<removed>" />
<noscript>
<p>Script is disabled. Click Submit to continue.</p>
<input type="submit" value="Submit" />
</noscript>
</form>
<script language="javascript">document.forms[0].submit();</script>
</body>
我删除的不记名令牌在反序列化时包含我的信息,而不是我的消费应用程序。所以,它试图对我进行身份验证,而不是使用不记名令牌进行身份验证。
有什么解决办法吗?
更新 1
通过更新,我提取了与我的消费应用程序相关的 servicePrincipal 数据,它清楚地表明消费应用程序应该能够与 API 应用程序对话。
"oauth2Permissions": [{
"adminConsentDescription": "Allow the application to access Ticketing API on behalf of the signed-in user.",
"adminConsentDisplayName": "Access Ticketing API",
"id": "<removed>",
"isEnabled": true,
"type": "User",
"userConsentDescription": "Allow the application to access Ticketing API on your behalf.",
"userConsentDisplayName": "Access Ticketing API",
"value": "user_impersonation"
}]
更新 2
我制作了一个控制台应用程序来尝试这种方式。我得到了 401(未经授权)。
一个有趣的观察是,如果我转到 jwt.io 并将我的令牌粘贴进去,它能够反序列化它,但它也说令牌无效(无效签名)。不确定这意味着什么。
您是否在使用“UseWindowsAzureActiveDirectoryBearerAuthentication”?
在 Web API 你应该使用它,将它添加到启动配置中。如下:
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
新的 WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
观众 = ConfigurationManager.AppSettings["ida:Audience"],
租户 = ConfigurationManager.AppSettings["ida:Tenant"],
});
希望这对你有用,
问候!
我在弄清楚如何打开详细日志记录并通过它们倾诉后发现了这个问题。
MSDN 上的文档说要将 "resource" 作为 App ID Uri 传递。但是您实际上需要将客户端 ID 作为 "resource." 的值传递。一旦我更改了它,一切都完美无缺。
我在 LogFiles\Application 的 txt 文件中找到了这个。
2016-07-12T15:48:39 PID[8584] Warning JWT validation failed: IDX10214: Audience validation failed. Audiences: 'https://<removed>.azurewebsites.net'. Did not match: validationParameters.ValidAudience: '0b61abb8-59...7-6046c22f9c92' or validationParameters.ValidAudiences: 'null'.
我查看的文档不正确:
https://msdn.microsoft.com/en-us/library/partnercenter/dn974935.aspx
https://msdn.microsoft.com/en-us/library/azure/dn645543.aspx(这是最大的罪犯,因为它完全按照我想要的方式处理不正确的信息)
我有一个使用 Azure AD (AAD) 保护的 API 应用程序。我还有一个用于消费应用程序的 AAD 应用程序,并且在消费应用程序中我设置了访问 API 应用程序的权限。
我可以获得令牌,但是当我去使用令牌时,API 应用程序似乎没有查看授权 header。它试图通过网络浏览器让我登录。
我的请求是这样的:
GET /api/ticketing/issueTopics HTTP/1.1
Host: <removed>
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc<rest is removed>
Cache-Control: no-cache
This is what my Fiddler looks like.
我在 Postman 中得到的结果是一些 MS 重定向页面:
<html>
<head>
<title>Working...</title>
</head>
<body>
<form method="POST" name="hiddenform" action="<removed>/.auth/login/aad/callback">
<input type="hidden" name="id_token" value="<bearer token removed>" />
<input type="hidden" name="state" value="/api/ticketing/issueTopics" />
<input type="hidden" name="session_state" value="<removed>" />
<noscript>
<p>Script is disabled. Click Submit to continue.</p>
<input type="submit" value="Submit" />
</noscript>
</form>
<script language="javascript">document.forms[0].submit();</script>
</body>
我删除的不记名令牌在反序列化时包含我的信息,而不是我的消费应用程序。所以,它试图对我进行身份验证,而不是使用不记名令牌进行身份验证。
有什么解决办法吗?
更新 1
通过更新,我提取了与我的消费应用程序相关的 servicePrincipal 数据,它清楚地表明消费应用程序应该能够与 API 应用程序对话。
"oauth2Permissions": [{
"adminConsentDescription": "Allow the application to access Ticketing API on behalf of the signed-in user.",
"adminConsentDisplayName": "Access Ticketing API",
"id": "<removed>",
"isEnabled": true,
"type": "User",
"userConsentDescription": "Allow the application to access Ticketing API on your behalf.",
"userConsentDisplayName": "Access Ticketing API",
"value": "user_impersonation"
}]
更新 2
我制作了一个控制台应用程序来尝试这种方式。我得到了 401(未经授权)。
一个有趣的观察是,如果我转到 jwt.io 并将我的令牌粘贴进去,它能够反序列化它,但它也说令牌无效(无效签名)。不确定这意味着什么。
您是否在使用“UseWindowsAzureActiveDirectoryBearerAuthentication”? 在 Web API 你应该使用它,将它添加到启动配置中。如下:
app.UseWindowsAzureActiveDirectoryBearerAuthentication( 新的 WindowsAzureActiveDirectoryBearerAuthenticationOptions { 观众 = ConfigurationManager.AppSettings["ida:Audience"], 租户 = ConfigurationManager.AppSettings["ida:Tenant"], });
希望这对你有用, 问候!
我在弄清楚如何打开详细日志记录并通过它们倾诉后发现了这个问题。
MSDN 上的文档说要将 "resource" 作为 App ID Uri 传递。但是您实际上需要将客户端 ID 作为 "resource." 的值传递。一旦我更改了它,一切都完美无缺。
我在 LogFiles\Application 的 txt 文件中找到了这个。
2016-07-12T15:48:39 PID[8584] Warning JWT validation failed: IDX10214: Audience validation failed. Audiences: 'https://<removed>.azurewebsites.net'. Did not match: validationParameters.ValidAudience: '0b61abb8-59...7-6046c22f9c92' or validationParameters.ValidAudiences: 'null'.
我查看的文档不正确:
https://msdn.microsoft.com/en-us/library/partnercenter/dn974935.aspx https://msdn.microsoft.com/en-us/library/azure/dn645543.aspx(这是最大的罪犯,因为它完全按照我想要的方式处理不正确的信息)