Adal.NET获取当前应用程序的令牌

时间:2018-11-13 14:45:54

标签: c# asp.net azure jwt adal

是否有可能获取当前应用程序的jwt令牌,而不是基于另一个Azure应用程序,或者在整个登录生命周期内保留它?

在我的应用中,我正在使用Owin和OpenIdConnect对用户进行Azure身份验证。身份验证成功,我从Azure收到了令牌。

在以后的方法中,我需要将令牌作为参数传递,因此现在我将其存储在会话变量中,但这会更早过期并导致空变量。

现在我正在尝试使用ADAL从Azure获取令牌。

 string userObjectId = ((ClaimsIdentity)User.Identity).Claims.FirstOrDefault(c => c.ToString() == "http://schemas.microsoft.com/identity/claims/objectidentifier")?.Value;
 AuthenticationContext authContext = new AuthenticationContext(ConfigurationManager.AppSettings["ida:AADInstance"] + ConfigurationManager.AppSettings["ida:TenantId"], new TokenCache());
 ClientCredential credential = new ClientCredential(ConfigurationManager.AppSettings["ida:ClientId"], "client_secret"); 
 var result = authContext.AcquireTokenAsync(ConfigurationManager.AppSettings["ida:ClientId"], credential).Result.AccessToken;

这会导致错误:

{"error":"invalid_grant","error_description":"AADSTS50105: Application > 
'4337e286-7b84-4377-8843-82ea9504606b' is not assigned to a role for the application '4337e286-7b84-4377-8843-82ea9504606b'}

对于其他应用程序,它与具有该资源许可权的另一个应用程序一起设置,但是我不想依赖另一个应用程序来获取令牌。

有人知道吗?

编辑

我一直遵循@ Jean-MarcPrieur的建议,但在网上

var accounts = await application.GetAccountsAsync();

它不返回任何帐户,从而导致结果为空,也没有accessToken。

1 个答案:

答案 0 :(得分:1)

您在这里尝试使用client credentials flow(这需要您的应用程序注册权限才能调用要调用的Web API-租户管理员权限)。

如果要以用户名访问资源,则需要获取令牌以让您的应用以已登录用户名的身份调用API。 例如,参见以下示例:https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/aspnetcore2-2-signInAndCallGraph,该示例登录用户并调用图形 这是一个使用Azure AD v2.0终结点(最新技术)的ASP.NET Core示例。如果您还有其他限制,请随时询问。