Microsoft Azure OAuth 2.0-能否存储授权令牌以供重用?

Microsoft Azure OAuth 2.0-能否存储授权令牌以供重用?,azure,authentication,oauth-2.0,Azure,Authentication,Oauth 2.0,我有一个应用程序当前使用基本身份验证读取Exchange Online邮箱。我们正在考虑将basic auth升级到OAuth2.0,因为basic auth正在被去润滑。此应用程序作为服务运行,并读取和回复邮箱中的邮件 由于应用程序读取帐户的邮箱,因此,因为它需要以用户身份登录。目前,我们使用,并通过在浏览器中通过oauth2授权链接登录并同意,为邮箱用户提供用户同意,实现了这一点: https://login.microsoftonline.com/{tenant_id}/oauth2/v2

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

由于应用程序读取帐户的邮箱,因此,因为它需要以用户身份登录。目前,我们使用,并通过在浏览器中通过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也不推荐这种情况

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

似乎是这样的-使用交互式登录请求身份验证令牌,然后使用该身份验证令牌请求访问令牌。如果该访问令牌过期,则可以使用auth令牌请求新的访问令牌。我们的身份验证令牌可以保留并重新使用,而无需新的交互式提示

所以我的问题是,在授权并给予用户同意并接收授权令牌(通过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请求,通过传入身份验证令牌而不是用户名/密码来请求访问令牌


谢谢。

听起来您可能没有正确地进行令牌缓存。身份验证后,您的应用程序将收到一个刷新令牌,该令牌可用于获取新的访问令牌。检查有关缓存的文档,例如:@juunas使用用户名/密码登录后,我可以成功缓存令牌。这是正常的,但我不想有这样的要求登录用户名和密码,如果可能的话。登录后,我可以使用App.AcquireTokenSilent获得一个新的访问令牌,但只有在使用服务中的用户名/密码登录后才能获得。有没有办法在服务外部以交互方式获取身份验证令牌(这是一个没有接口的windows服务),然后将身份验证令牌存储在服务可以访问它的地方?当然可以。我们已经在一个Web应用程序中这样做了,基本方法应该是相同的。您需要做的是从两个位置使用相同的令牌缓存,例如两个进程都可以访问的文件。您很可能需要采取一些措施来保护此文件不受不必要的访问,但我不是最了解桌面内容的人:/这些示例确实为使用文件的桌面应用程序提供了令牌缓存实现。您可以做到这一点。请在此处查看代码示例: