针对天蓝色广告和EWS的服务身份验证

时间:2018-11-13 10:57:25

标签: oauth-2.0 azure-active-directory

我正在构建守护程序/非交互式服务,以将OWS作为特定用户使用O365。为了通过OAUTH2.0与EWS通信,我试图正确注册应用程序并针对AAD进行身份验证。最好是我想使用基于证书的身份验证,但我还没走那么远。

下面的代码(正常工作):

    static void Main(string[] args)
    {
        string tenant = "redacted.onmicrosoft.com";
        string authority = "https://login.microsoftonline.com/" + tenant;
        string clientId = "44964df2-3333-2222-1111-redcated";
        string resource = "https://outlook.office365.com";
        string clientSecret = "redacted";
        string username = "username@redacted.onmicrosoft.com";
        string password = "redacted";

        AuthenticationResult authenticationResult = null;
        AuthenticationContext authenticationContext = new AuthenticationContext(authority, false);

        var userCred = new UserPasswordCredential(username, password);
        ClientCredential clientCred = new ClientCredential(clientId, clientSecret);

        string errorMessage = null;
        try
        {
            Console.WriteLine("Trying to acquire token");
            authenticationResult = authenticationContext.AcquireTokenAsync(resource, clientId, userCred).Result;
        }
        catch (AdalException ex)
        {
            errorMessage = ex.Message;
            if (ex.InnerException != null)
            {
                errorMessage += "\nInnerException : " + ex.InnerException.Message;
            }
        }
        catch (ArgumentException ex)
        {
            errorMessage = ex.Message;
        }
        if (!string.IsNullOrEmpty(errorMessage))
        {
            Console.WriteLine("Failed: {0}" + errorMessage);
            return;
        }
        Console.WriteLine("\nMaking the protocol call\n");
        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
        service.Credentials = new OAuthCredentials(authenticationResult.AccessToken);
        service.TraceEnabled = true;
        service.TraceFlags = TraceFlags.All;
        service.Url = new Uri(resource + "/EWS/Exchange.asmx");
        EmailMessage email = new EmailMessage(service);
        email.ToRecipients.Add("redacted@gmail.com");
        email.Subject = "HelloWorld from EWS";
        email.Body = new MessageBody("Test from EWS");
        email.Send();
    }

此代码按预期工作,但是,我还需要确保它是安全的/符合最佳实践。

在使用代码时,我将应用程序注册为“本机”,但是后来我发现Micrsofts手册说您不应在本机应用程序中使用client_secret,并且该代码中的代码实际上也未使用客户端密码当前形式。

考虑用例(非交互式服务作为一个特定用户进行身份验证),这是正确的方法吗?

在AAD中注册服务时应该考虑什么?

1 个答案:

答案 0 :(得分:-1)

  

我后来发现Micrsofts手册说您不应使用   使用本机应用程序的client_secret

Client_secret不能在本机应用程序(公共客户端)中使用,因为client_secrets无法可靠地存储在设备上。能够将client_secret安全地存储在服务器端的Web应用程序和Web API(所有机密客户端)是必需的。

  

考虑用例(非交互式服务作为一个身份验证   特定用户),这是正确的方法吗?

是的,OAuth 2.0客户端凭据授予流程允许Web服务(机密客户端)使用其自己的凭据而不是模拟用户,从而在调用另一个Web服务时进行身份验证。当Oauth 2.0身份验证代码授予流程并且OpenId Connect冒充需要用户登录的用户时。

  

在AAD中注册服务时应该考虑什么?

您可以阅读此doc,它将介绍有关AAD服务的主要结构。