首页 > 解决方案 > Microsoft Azure OAuth 2.0 - 您可以存储授权令牌以供重复使用吗?

问题描述

我有一个应用程序当前使用基本身份验证来读取 Exchange Online 邮箱。我们正在考虑将我们的基本身份验证升级到 OAuth2.0,因为基本身份验证正在被弃用。此应用程序作为服务运行,并读取和回复邮箱中的消息。

由于该应用读取了一个帐户的邮箱,因此不适用 Daemon 应用场景,因为它需要以用户身份登录。现在,我们使用用户名和密码进行这项工作,并通过登录并通过浏览器中的 oauth2 授权链接同意邮箱用户提供用户同意:

https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/authorize?
client_id={client_id}
&response_type=code
&response_mode=query
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.send%20https%3A%2F%2Fgraph.microsoft.com%2Fmail.readwrite

这允许应用程序登录用户的邮箱并通过用户名密码阅读/发送电子邮件。但是,这种情况并不理想,Microsoft 也不推荐。

我需要的是一种应用程序以用户身份读取邮箱而不需要多个交互式提示的方式 - 即我们授权应用程序并提供一次同意以登录和使用邮箱,然后我们可以存储该授权,并在下次重新使用该授权登录。本质上,我需要在初始授权后永久存储授权。

授权代码流似乎是这样做的- 使用交互式登录请求身份验证令牌,然后使用该身份验证令牌请求访问令牌。如果该访问令牌过期,则身份验证令牌可用于请求新的访问令牌。我们的身份验证令牌可以在没有新的交互式提示的情况下保留和重复使用。

所以我的问题是,在为用户授权和同意并收到授权令牌(通过 Web 应用程序或控制台应用程序,甚至使用上面的 url)之后,可以存储和重用该令牌吗?我当前的代码每次都通过用户名/密码获取访问令牌:

AuthenticationResult result = null;
var accounts = await App.GetAccountsAsync();

if (accounts.Any())
{
    result = await (App as Microsoft.Identity.Client.PublicClientApplication).AcquireTokenSilent(scopes, accounts.FirstOrDefault())
        .ExecuteAsync();
}
else
{
    try
    {
        result = await App.AcquireTokenByUsernamePassword(scopes, username, password)
        .ExecuteAsync();
    }
    catch () //Handle different exception here
    {
    }
}

return result;

然后使用来自 AuthenticationResult 的 AccessToken 实例化一个新的 GraphServiceClient

    string sToken = authenticationResult.AccessToken;
GraphClient = new GraphServiceClient(
    new DelegateAuthenticationProvider((requestMessage) =>
    {
        requestMessage
            .Headers
            .Authorization = new AuthenticationHeaderValue("bearer", sToken);
        return Task.FromResult(0);
    }));

如果我进行一次性授权并存储该令牌,我可以在以后重新使用该令牌进行登录(使用它来获取新的访问令牌)吗?我的印象是这些代币不是长期的。身份验证令牌的生命周期是什么,它们可以这样使用吗?如果可以,我如何替换我的 App.AcquireTokenByUsernamePassword 请求,通过传入 Auth 令牌而不是用户名/密码来请求访问令牌?

谢谢。

标签: azureauthenticationoauth-2.0

解决方案


推荐阅读