我从Office 365使用邮箱进行Exchange Online,我需要使用使用托管EWS的控制台C#应用程序访问此邮箱。要求是控制台应用程序应使用OAuth身份验证来访问Exchange Online。
我已经设置了Azure AD,并在那里创建了一个应用程序,收到了clientid和重定向uri。我已经给了应用程序完全权限 - 请看下面的截图:
我使用.NET的Active Directory身份验证库(来自NuGet的最新版本)来发布令牌,但是有问题让它运行...
我的代码是:
AuthenticationContext authenticationContext = new AuthenticationContext("https://login.windows.net/rsoftgroup.onmicrosoft.com", false);
AuthenticationResult authenticationResult = null;
try
{
var authenticationTask = authenticationContext.AcquireTokenAsync(
"outlook.office365.com",
"c4fa7d60-df1e-4664-a8f8-fb072d0bb287",
new Uri(redirectUri),
new PlatformParameters(PromptBehavior.Never)
);
authenticationTask.Wait();
authenticationResult = authenticationTask.Result;
exchangeService.Credentials = new OAuthCredentials(authenticationResult.AccessToken);
}
catch (AdalException)
{
// Exception occured on the authentication process.
}
我收到带有消息的AdalException:" user_interaction_required:遇到以下两个条件之一:1。传递了PromptBehavior.Never标志,但由于需要用户交互,因此无法遵守约束。 2.静默Web身份验证期间发生错误,阻止http身份验证流程在足够短的时间内完成"
有人可以帮我解决这个问题吗?
我需要OAuth身份验证才能在没有用户交互的情况下工作,因为这将是一个命令行应用程序......
任何建议都非常感谢。
答案 0 :(得分:1)
您的应用程序仍然需要作为某个用户进行身份验证,目前如果您查看由于PromptBehavior.Never而未进行身份验证的代码,并且您未指定任何用户凭据并使用隐式身份验证流程,例如{{3 }}
对于要进行身份验证的标准控制台应用程序(例如,在运行应用程序时询问凭据)我会使用带外调用urn:ietf:wg:oauth:2.0:oob(然后你不需要重定向端点)并设置代码以提示例如
AuthenticationContext ac = new AuthenticationContext("https://login.windows.net/Common");
var authenticationTask = ac.AcquireTokenAsync(
"https://graph.windows.net",
"5471030d-f311-4c5d-91ef-74ca885463a7",
new Uri("urn:ietf:wg:oauth:2.0:oob"),
new PlatformParameters(PromptBehavior.Always)
).Result;
Console.WriteLine(authenticationTask.AccessToken);
当您运行控制台应用程序窗口时,ADAL库将处理管道并显示正确的身份验证提示并返回令牌,您可以获得减少攻击面的好处而不是在代码中自行提示凭据(或者参数等)
正如Venkat评论所说,如果你不需要使用EWS(例如没有现有的代码库投资等),那么使用REST端点可能是一个更好的解决方案,如果你构建一个守护进程类型的应用程序,因为你可以利用这种类型的身份验证流程,例如http://www.cloudidentity.com/blog/2014/07/08/using-adal-net-to-authenticate-users-via-usernamepassword/