当前应用程序的 Adal.NET 获取令牌
Posted
技术标签:
【中文标题】当前应用程序的 Adal.NET 获取令牌【英文标题】:Adal.NET acquiretoken for current application 【发布时间】:2019-04-16 10:28:07 【问题描述】:是否可以为当前应用程序获取 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】:您在这里尝试使用client credentials flow(这需要您的应用注册权限才能调用您要调用的 Web API - 租户管理员权限)。
如果您想以用户的名义访问资源,您需要为您的应用获取一个token,以便以登录用户的名义调用API。 例如,请参阅此示例:https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/aspnetcore2-2-signInAndCallGraph 登录用户并调用图表 这是一个使用 Azure AD v2.0 端点(最新技术)的 ASP.NET Core 示例。如果您有其他限制,请不要犹豫。
【讨论】:
您可以重复使用 powershell app id 来绕过注册要求。 @Swend,这种不好的做法。每个应用都应该有自己的应用注册。 @Jean-MarcPrieur 这也可以在 .NET 中使用吗? @NiAu:我不明白你的问题。 .NET 中可以使用什么?我提供了 .NET 链接?以上是关于当前应用程序的 Adal.NET 获取令牌的主要内容,如果未能解决你的问题,请参考以下文章
ADAL .Net Core nuget 包不支持 UserPasswordCredential
如何在 C# 中从 Facebook SDK 获取当前用户访问令牌?不是应用访问令牌
在基于 JHipster UAA 的微服务应用程序中获取当前访问令牌
实现 JWT 身份验证 Azure Function 3.x - 使用 JWT 令牌获取当前用户的声明