我有一个MVC应用程序需要访问受Azure AD身份验证保护的Azure中的私有API应用程序。因此,我需要获取Azure AD持有者令牌,将其转移到Zumo-Auth
令牌并使用它来访问API应用程序。
我正在经历this tutorial,一切正常,直到我需要从authContext
请求令牌。以下是代码片段:
var authContext = new AuthenticationContext(
"https://login.microsoftonline.com/MyADDomain.onmicrosoft.com");
ClientCredential credential = new ClientCredential(
"04472E33-2638-FAKE-GUID-F826AF4928DB",
"OMYAPIKEY1x3BLAHEMMEHEHEHEHEeYSOMETHINGRc=");
// Get the AAD token.
var appIdUri =
"https://MyAppGateway-814485545465FAKE4d5a4532cd.azurewebsites.net/login/aad";
//var appIdUri = "https://MyADDomain.onmicrosoft.com/MyAppName";
//var appIdUri = "https://MyADDomain.onmicrosoft.com/";
//var appIdUri = "https://graph.windows.net";
AuthenticationResult result =
authContext.AcquireToken(appIdUri, credential); // <-- can't get the token from AD
// downhill from here
var aadToken = new JObject();
aadToken["access_token"] = result.AccessToken;
var appServiceClient = new AppServiceClient(
"https://MyAppGateway-814485545465FAKE4d5a4532cd.azurewebsites.net/");
// Send the AAD token to the gateway and get a Zumo token
var appServiceUser = await appServiceClient.LoginAsync("aad", aadToken);
authContext.AcquireToken(appIdUri, credential)
行是导致问题的行。
如果我appIdUri
https://MyAppGateway-814485545465FAKE4d5a4532cd.azurewebsites.net/login/aad
,我会得到例外:
400:AdalServiceException:AADSTS50001:未为该帐户注册资源“https://MyAppGateway-814485545465FAKE4d5a4532cd.azurewebsites.net/login/aad”。
但是这个确切的行在AD应用程序的Reply Url
列表中
当我尝试将https://MyADDomain.onmicrosoft.com/MyAppName
或https://MyADDomain.onmicrosoft.com/
用作appIdUri
时,我收到了不同的异常消息:
400:AdalServiceException:AADSTS50105:应用程序“04472E33-2638-FAKE-GUID-F826AF4928DB”未分配给应用程序“https://MyADDomain.onmicrosoft.com/MyAppName”的角色
或
400:AdalServiceException:AADSTS50105:应用程序“04472E33-2638-FAKE-GUID-F826AF4928DB”未分配给应用程序“https://MyADDomain.onmicrosoft.com/”的角色
在这两种情况下,我都将AD应用中的App ID URI
设置为“https://MyADDomain.onmicrosoft.com/MyAppName”或“https://MyADDomain.onmicrosoft.com/”。以及Reply URL
列表中的两个名称。
最后经过多次尝试后,我将https://graph.windows.net
作为appIdUri
并获得了持有者令牌。但令牌在过去有效期(过去约1分钟)。所以我对此无能为力。在尝试使用令牌登录API App时获得401-Unauthenticated
。
我错过了什么?
答案 0 :(得分:7)
我已经按照你提到的教程进行了操作:Call an Azure API app from a web app client authenticated by Azure Active Directory
然后我能够检索令牌,正如您在下面的演示中所看到的,我的代码与您的代码没有什么不同,除了它使用using Microsoft.IdentityModel.Clients.ActiveDirectory
库的更高版本使用{{ 1}}。
Async
class Program
{
static void Main(string[] args)
{
var authContext = new AuthenticationContext(Constants.AUTHORITY);
var credential =
new ClientCredential(Constants.CLIENT_ID, Constants.CLIENT_SECRET);
var result = (AuthenticationResult)authContext
.AcquireTokenAsync(Constants.API_ID_URL, credential)
.Result;
var token = result.AccessToken;
Console.WriteLine(token.ToString());
Console.ReadLine();
}
}
。第一部分是https://login.microsoftonline.com。最后一段是允许的租户。我们在portal.azure.com上设置允许的租户,转到我们的应用程序的网关,然后选择设置&gt;身份&gt; Azure Active Directory&gt;允许的租户。我的租客是bigfontoutlook.onmicrosoft.com。
AUTHORITY
。我们从添加到Azure Active Directory的应用程序中检索此客户端ID。在manage.windowsazure.com上找到这个&gt;活动目录&gt;您的目录&gt;申请&gt;您的申请&gt;配置。检索完毕后,我们必须将其添加到客户端ID字段中的Gateway的Azure Active Directory设置中。
CLIENT_ID
。我们在检索客户端ID的相同位置创建/检索它。
CLIENT_SECRET
。我们通过选择设置&gt;在我们的Web API应用程序的Gateway刀片中检索此内容。身份&gt; Azure Active Directory&gt;应用网址。
以下是适合我的那些。
API_ID_URL
这是解码的JWT访问令牌所包含的内容。
class Constants
{
public const string AUTHORITY =
"https://login.microsoftonline.com/bigfontoutlook.onmicrosoft.com/";
public const string CLIENT_ID =
"0d7dce06-c3e3-441f-89a7-f828e210ff6d";
public const string CLIENT_SECRET =
"AtRMr+Rijrgod4b9Q34i/UILldyJ2VO6n2jswkcVNDs=";
public const string API_ID_URL =
"https://mvp201514929cfaaf694.azurewebsites.net/login/aad";
}
注意:这是一个带有一次性资源组的一次性活动目录帐户中的一次性应用程序,因此显示我的安全凭据不是问题。