我正在构建守护程序/非交互式服务,以将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中注册服务时应该考虑什么?
答案 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服务的主要结构。