0

Ich versuche, einen Bot zu erstellen, der Besprechungen buchen kann. Um dies zu tun, muss ich auf den Kalender eines Mitarbeiters zugreifen, um FreeBusy-Informationen zu erhalten, um letztendlich ein Meeting zu buchen. Ich versuche, die E-Mail und das Kennwort nicht hart zu codieren, und dafür möchte ich ein Zugriffstoken von Azure AD verwenden, um EWS aufzurufen. stelle ich die Eigenschaften fürEWS Oauth Ausnahme: Die Anfrage ist fehlgeschlagen. Der Remote-Server hat einen Fehler zurückgegeben: (401) Nicht autorisiert

public static ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013); 

dieser Methode:

 public static async System.Threading.Tasks.Task UseExchangeService(IDialogContext context, string userEmailAddress, SecureString  userPassword) 
     { 
     string authority = ConfigurationManager.AppSettings["authority"]; 
     string clientID = ConfigurationManager.AppSettings["clientID"]; 
     string resource = ConfigurationManager.AppSettings["resource"]; 
     string appKey = ConfigurationManager.AppSettings["appkey"]; 

     AuthenticationContext authenticationContext = new AuthenticationContext(authority, false); 
     ClientCredential clientCred = new ClientCredential(clientID, appKey); 
     AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(resource, clientCred); 
     service.Url = new Uri(ConfigurationManager.AppSettings["serverName"] + "/ews/exchange.asmx"); 
     service.TraceEnabled = true; 
     service.TraceFlags = TraceFlags.All; 
     service.Credentials = new OAuthCredentials(authenticationResult.AccessToken); 


     // USING THIS LINE IT WORKS FINE! 
     // service.Credentials = new NetworkCredential(userEmailAddress, userPassword); // VIRKER 

    } 

ich tun, um die Zugriffstoken von Azure AD und ich habe die Erlaubnis für die Anwendung in Azure AD gewährt.

Ich benutze diese Methode die freebusytimes zu extrahieren, enthält es andere mehr Code, um die Zeiten als Tasten auf einem herocard angezeigt werden, aber dies ist der Aufruf von EWS:

 List<AttendeeInfo> attendees = new List<AttendeeInfo>(); 
     attendees.Add(new AttendeeInfo() 
     { 
      SmtpAddress = "MyEMAIL", 
      AttendeeType = MeetingAttendeeType.Organizer 
     }); 

     attendees.Add(new AttendeeInfo() 
     { 
      SmtpAddress = BookersEmail, 
      AttendeeType = MeetingAttendeeType.Required 
     }); 
     //DateTime date1 = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day.Ad, 7, 0, 0) 
     // Specify options to request free/busy information and suggested meeting times. 
     AvailabilityOptions availabilityOptions = new AvailabilityOptions(); 
     availabilityOptions.GoodSuggestionThreshold = 49; 
     availabilityOptions.MaximumNonWorkHoursSuggestionsPerDay = 0; 
     availabilityOptions.MaximumSuggestionsPerDay = 20; 
     // Note that 60 minutes is the default value for MeetingDuration, but setting it explicitly for demonstration purposes. 
     availabilityOptions.MeetingDuration = 60; 
     availabilityOptions.MinimumSuggestionQuality = SuggestionQuality.Excellent; 

     //TimeWindow hej = new TimeWindow(); 
     DateTime StartDay = DateTime.Now.AddDays(1); 
     TimeSpan ts = new TimeSpan(9, 0, 0); 
     DateTime StartTime = StartDay.Date + ts; 

     availabilityOptions.DetailedSuggestionsWindow = new TimeWindow(StartTime, DateTime.Now.AddDays(4)); 
     availabilityOptions.RequestedFreeBusyView = FreeBusyViewType.FreeBusy; 
     // Return free/busy information and a set of suggested meeting times. 
     // This method results in a GetUserAvailabilityRequest call to EWS. 
     GetUserAvailabilityResults results = service.GetUserAvailability(attendees, 
                     availabilityOptions.DetailedSuggestionsWindow, 
                     AvailabilityData.FreeBusyAndSuggestions, 
                     availabilityOptions); 

ich die Anwendung in Azure erstellt haben AD und ich habe die folgenden Berechtigungen erteilt: Office 365 Exchange Online:

Verwenden Exchange Web Services mit vollem Zugriff auf alle Postfächer

lesen und schreiben von Kalendern in allen Briefkästen

lesen und schreiben Benutzer und gemeinsame Kalender

Zugang Briefkästen als die angemeldeten Nutzer über Exchange Web Services

ich andere Antworten versucht habe ich auf Stackoverflow gefunden, aber sie tun nicht den Trick für mich. Hoffnung, die Sie helfen können

+0

Können Sie Ihren Beitrag mit einer Frage bearbeiten. Ich bin mir nicht sicher, was du fragst. –

Antwort

1

Ich bin nicht vertraut mit EWS, aber soweit ich weiß, dass die Microsoft Graph auch die ähnliche Funktion sorgt für die zur Verfügung stehende Besprechungszeit finden Sie den Rest unter (siehe here) mit:

POST /me/findMeetingTimes 

Und wenn Sie diese REST für die Webanwendung verwenden möchten, damit Ihre Webanwendung den Anmeldebenutzer zur Ausführung des Vorgangs für Exchange delegieren kann, können wir den OAuth 2.0-Codezuweisungsfluss verwenden. Und wie diese Strömung verwenden, um mit Microsoft Graph zu integrieren, können Sie auf die Links unten entnehmen können:

Get started with Microsoft Graph in an ASP.NET 4.6 MVC app

Und hier ist das Detail für diesen Fluss:

Authorize access to web applications using OAuth 2.0 and Azure Active Directory

Hoffe, es ist hilfreich.

Verwandte Themen