Azure AD:验证本机应用程序时出现user_interaction_required问题

时间:2016-05-22 13:54:50

标签: c# azure oauth office365 exchangewebservices

我从Office 365使用邮箱进行Exchange Online,我需要使用使用托管EWS的控制台C#应用程序访问此邮箱。要求是控制台应用程序应使用OAuth身份验证来访问Exchange Online。

我已经设置了Azure AD,并在那里创建了一个应用程序,收到了clientid和重定向uri。我已经给了应用程序完全权限 - 请看下面的截图:

enter image description here

我使用.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身份验证才能在没有用户交互的情况下工作,因为这将是一个命令行应用程序......

任何建议都非常感谢。

1 个答案:

答案 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/