gpt4 book ai didi

asp.net - .Net Core 2.0 - 获取 AAD 访问 token 以与 Microsoft Graph 一起使用

转载 作者:行者123 更新时间:2023-12-02 10:42:04 25 4
gpt4 key购买 nike

使用 Azure AD 身份验证启动新的 .Net Core 2.0 项目时,您将获得一个可以登录租户的工作示例,太棒了!

现在我想获取登录用户的访问 token 并使用它来使用 Microsoft Graph API。

我没有找到任何有关如何实现此目标的文档。我只想要一种简单的方法来获取访问 token 并访问图形 API,使用启动新的 .NET Core 2.0 项目时创建的模板。从那里我应该能够弄清楚其余的事情。

非常重要的是,它可以与在 Visual Studio 中创建新的 2.0 MVC Core 应用程序时选择工作和学校帐户进行身份验证的过程中创建的项目配合使用。

最佳答案

我写了一篇博客文章,展示了如何做到这一点:ASP.NET Core 2.0 Azure AD Authentication

TL;DR 是,当您从 AAD 收到授权代码时,您应该添加这样的处理程序:

.AddOpenIdConnect(opts =>
{
Configuration.GetSection("Authentication").Bind(opts);

opts.Events = new OpenIdConnectEvents
{
OnAuthorizationCodeReceived = async ctx =>
{
var request = ctx.HttpContext.Request;
var currentUri = UriHelper.BuildAbsolute(request.Scheme, request.Host, request.PathBase, request.Path);
var credential = new ClientCredential(ctx.Options.ClientId, ctx.Options.ClientSecret);

var distributedCache = ctx.HttpContext.RequestServices.GetRequiredService<IDistributedCache>();
string userId = ctx.Principal.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;

var cache = new AdalDistributedTokenCache(distributedCache, userId);

var authContext = new AuthenticationContext(ctx.Options.Authority, cache);

var result = await authContext.AcquireTokenByAuthorizationCodeAsync(
ctx.ProtocolMessage.Code, new Uri(currentUri), credential, ctx.Options.Resource);

ctx.HandleCodeRedemption(result.AccessToken, result.IdToken);
}
};
});

这里我的 context.Options.Resourcehttps://graph.microsoft.com (Microsoft Graph),我从配置中绑定(bind)它以及其他设置(客户端 ID 等)。

我们使用 ADAL 兑换 token ,并将生成的 token 存储在 token 缓存中。

token 缓存是您必须创建的内容,这是 example app 中的示例:

public class AdalDistributedTokenCache : TokenCache
{
private readonly IDistributedCache _cache;
private readonly string _userId;

public AdalDistributedTokenCache(IDistributedCache cache, string userId)
{
_cache = cache;
_userId = userId;
BeforeAccess = BeforeAccessNotification;
AfterAccess = AfterAccessNotification;
}

private string GetCacheKey()
{
return $"{_userId}_TokenCache";
}

private void BeforeAccessNotification(TokenCacheNotificationArgs args)
{
Deserialize(_cache.Get(GetCacheKey()));
}

private void AfterAccessNotification(TokenCacheNotificationArgs args)
{
if (HasStateChanged)
{
_cache.Set(GetCacheKey(), Serialize(), new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromDays(1)
});
HasStateChanged = false;
}
}
}

此处的 token 缓存使用分布式缓存来存储 token ,以便为您的应用程序提供服务的所有实例都可以访问 token 。它们按用户缓存,因此您可以稍后检索任何用户的 token 。

然后,当您想要获取 token 并使用 MS graph 时,您可以执行类似的操作(GetAccessTokenAsync() 中的重要内容):

[Authorize]
public class HomeController : Controller
{
private static readonly HttpClient Client = new HttpClient();
private readonly IDistributedCache _cache;
private readonly IConfiguration _config;

public HomeController(IDistributedCache cache, IConfiguration config)
{
_cache = cache;
_config = config;
}

[AllowAnonymous]
public IActionResult Index()
{
return View();
}

public async Task<IActionResult> MsGraph()
{
HttpResponseMessage res = await QueryGraphAsync("/me");

ViewBag.GraphResponse = await res.Content.ReadAsStringAsync();

return View();
}

private async Task<HttpResponseMessage> QueryGraphAsync(string relativeUrl)
{
var req = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0" + relativeUrl);

string accessToken = await GetAccessTokenAsync();
req.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

return await Client.SendAsync(req);
}

private async Task<string> GetAccessTokenAsync()
{
string authority = _config["Authentication:Authority"];

string userId = User.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
var cache = new AdalDistributedTokenCache(_cache, userId);

var authContext = new AuthenticationContext(authority, cache);

string clientId = _config["Authentication:ClientId"];
string clientSecret = _config["Authentication:ClientSecret"];
var credential = new ClientCredential(clientId, clientSecret);

var result = await authContext.AcquireTokenSilentAsync("https://graph.microsoft.com", credential, new UserIdentifier(userId, UserIdentifierType.UniqueId));

return result.AccessToken;
}
}

在那里,我们以静默方式获取 token (使用 token 缓存),并将其附加到对图的请求。

关于asp.net - .Net Core 2.0 - 获取 AAD 访问 token 以与 Microsoft Graph 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46566717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com