是否有可能获取当前应用程序的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。
答案 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示例。如果您还有其他限制,请随时询问。