如何使用Exchange Online / EWS托管API对控制台应用程序进行身份验证?

问题描述 投票:0回答:1

我正在开发供Exchange使用的控制台应用程序供个人使用,该应用程序使用Exchange Web Services托管API来替代“兑换”(不幸的是,我无法使用)。我的最终目标是在Windows计划任务中使用该应用程序以连接到我的Exchange邮箱并执行一些任务,例如在一年中的特定时间创建文件夹,将电子邮件移动到这些文件夹,设置项目保留策略等。

该应用程序进展顺利,但是我很好奇如何为该应用程序实现安全身份验证,因此我可以在工作中使用它。我知道Exchange Online won't let me connect automatically with default credentials(不确定是否包括现代身份验证...请参见下文),我将必须明确地传递它们。在开发过程中,我正在使用以下代码将用户ID和密码明确传递给Exchange:

string userId = UserPrincipal.Current.EmailAddress;
SecureString securePwd = new SecureString();

Console.Write("Current User ID/Email Address: {0}\n", userId);
Console.Write("Enter Password: ");

do
{
    key = Console.ReadKey(true);

    // Ignore the Backspace and Enter keys.
    if (key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter)
    {
        // Append the character to the password.
        securePwd.AppendChar(key.KeyChar);
        Console.Write("*");
    }
    else
    {
        if (key.Key == ConsoleKey.Backspace & securePwd.Length > 0)
        {
            securePwd.RemoveAt(securePwd.Length - 1);
            Console.Write("\b \b");
        }
        else if (key.Key == ConsoleKey.Enter)
        {
            break;
        }
    }
} while (true);

service.Credentials = new WebCredentials(new NetworkCredential(userId, securePwd));

我希望,因为我将在选择Run whether user is logged on or not选项的情况下创建Windows计划任务,并输入密码,因此该应用程序可以使用并传递与计划任务使用的相同凭据,因此我没有完全可以存储我的密码,但是我还没有找到任何可以允许这样做的密码。

我的工作已启用了Exchange Online的现代身份验证,当我使用Outlook客户端时,它似乎将Windows凭据传递给Exchange,而无需我明确输入Outlook客户端的凭据。 EWS托管API中是否有类似的东西,可以允许我的应用使用Windows凭据登录而无需显式传递它们?我知道您可以注册您的应用程序并使用OAuth,但是我想避免这种情况,因为这是供我个人使用的,并且我不确定是否可以在工作中注册我的应用程序。

如果以上操作无法实现,我已经看过许多文章,例如this one,其中提到了使用Windows凭据管理器,并且看起来很有希望,但是似乎我可能仍需要对我进行一些其他操作密码,然后再存储。如果我在Windows Credential Manager中创建凭据,并使用下面的代码(并使用CredentialManagement NuGet package)在上面的链接中实现代码,则密码以纯文本显示。

private const string PasswordName = "CredentialTest";

public static void Main(string[] args)
{
    LoadCredential();
    Console.ReadKey();
}

public static void LoadCredential()
{
    using (var cred = new CredentialManagement.Credential())
    {
        cred.Target = PasswordName;
        cred.Load();

        Console.WriteLine("Password: {0}", cred.Password);            
    }
}

建议将密码作为安全字符串读入,使用存储在app.config文件的加密部分中的密钥进行加密,然后将加密的密码存储在Windows Credential Manager中吗?

我遇到的另一个有趣的项目是EWS托管API中的ClientCertificateCredentials类。不幸的是,我还没有看到使用它的任何例子。这是另一种身份验证方法吗?可以使用自签名证书吗?如果是这样,是否需要在Exchange Online服务器上存储私钥?

我愿意接受其他想法,感谢您的帮助。

谢谢!

c# exchangewebservices ews-managed-api outlook-2016 credential-manager
1个回答
0
投票

Windows Credentials Manager当然是一个选项(这是Outlook仍然存储POP3 / AAMP4 / SMTP密码并用于存储Exchange凭据的方式)。请记住,Office 365将在2020年10月启用基本身份验证。OAuth可能是一个选项,但这意味着您仍然需要以某种方式提示用户输入凭据,并以某种方式存储访问和刷新令牌。首选解决方案是使用基于证书的身份验证-例如,请参见https://developermessaging.azurewebsites.net/2018/09/11/authenticating-against-exchange-web-services-using-certificate-based-oauth2-tokens/但这需要在服务器端导入证书,这需要管理员权限。

© www.soinside.com 2019 - 2024. All rights reserved.