Inzwischen ist es schwierig, sich eine Übersicht zu verschaffen, wo wichtige Informationen rund um das Thema „Teamwork“ bei Microsoft zu finden sind. Insofern finde ich es hilfreich, wenn man gelegentlich eine Sammlung von Quellen findet – in diesem Fall war es eine Vorarbeit die A. Chattopadhyay geleistet hat und aus der ich folgende (sehr Entwickler-lastige) Tabelle erstellen konnte:
What’s new in the Microsoft Teams platform and learn how to leverage the latest innovation to deliver something incredible. Dive deep into new features and take advantage of the momentum behind Microsoft Teams.
Boost productivity by re-using your solution instead of recreating it. Learn how and where to start harnessing your existing workplace investments across Microsoft solutions and other platforms. We’ll create apps and integrations that extend and modernize solutions using the Microsoft Teams platform, showcasing multiple real-world solutions from partners.
In this session, we’ll learn how to build a bot that uses Microsoft Graph to integrate Microsoft 365 data and Microsoft Teams. We’ll use device code authentication, security and directory APIs, the Bot Framework, and finally demonstrate how to push the bot into Microsoft Teams.
Microsoft Graph API support M365 in many ways. Other services like PowerApps and Flow provide direct or indirect integration with MS Graph API. Microsoft Flow, in particular, provide the capability to automate business processes and governance for various services in Azure and M365. When we add MS Graph API with Flow, it’s best combination. By using Graph API connector in Flow, you can automate many processes like creating new Teams, sending important messages in Teams, reviewing security threats and deciding the actions. All these capabilities are available build in the product. What you need is a business problem. As takeaway from this sessions, you will learn how to connect Graph API with Flow and use it for real world scenarios.
Microsoft Teams is shaping up as the hottest tool on the collaboration block, and bots are shaping up as the way to scale out interaction with complex internal IT systems. Furthermore, the performance of your team relies on the presence of the sweet aroma, taste, and heart-starting impact of caffeinated beverages. Using Microsoft Teams, Microsoft’s Bot Framework and LUIS from Azure Cognitive Services, learn how to add a bot to a Team, manage channel and private conversations to ask one of the most critical questions in today’s modern workplace – “who wants a coffee”?
Updated SharePoint Framework training package which is targeted to be used for self-learning or for redelivering provided material as a local training delivery inside of your own company or for your customers. All materials are provided for you to reuse anyway you preferred without any needs for asking permissions or notifying anyone (“sharing is caring”).
This sample demonstrates using the Microsoft Graph APIs for Microsoft teams to automate team lifecycles for Contoso Airlines. every night, they create a new team for each flight they are flying the following day, and after the flight, they archive the team…
Demo App für Microsoft Teams:
Airline example with „Flight information Bot, Passenger information Bot, Baggage information Bot …“ aber auch Beispiele für Manufacturing (Inventory Bot), Professional Services (Employee Leave App) etc.
HR Sample: a Microsoft Teams app that will be used by the Human Resources department within their Microsoft Teams clients. The app will facilitate the department’s hiring of new talent into the organization, provide immediate interview feedback, schedule interview loops, and improve the overall hiring process of new employees. Contoso HR Talent App will help you understand how to transform hiring and candidate management flow of new talent and make it more interactive and responsive for HR teams and interviewees.
Eine Sammlung von Trainings rund um Office. Hier finden Sie zahlreiche Beispiele. Dabei geht es nicht nur um die Erstellung von Addins für Office Anwendungen, sondern auch z. B. um Themen wie „Extend a Microsoft Teams app with Authentication“ oder „Build Microsoft Teams customization using SharePoint Framework“.
Eine spannende Sammlung stellen die „selfpacedlabs“ dar. Hier können die Trainings nach verschiedenen Gesichtspunkten gefiltert werden – insgesamt stehen über 150 Labs zur Verfügung. Diese reichen von „A day in the life of a teams admin“ bis zu „Administering Office 365 with Windows PowerShell“
Ich denke, dass trotz des hohen Entwickler-Anteils, viele interessante Informationen in den genannten Websites, Videos oder Artikeln rund um das Thema Teamwork verfügbar sind.
Wie in den Artikeln über MS Graph schon beschrieben, kann man damit auf vielfältigste Informationen aus der Microsoft Cloud zugreifen.
Hierzu gibt es wichtige Voraussetzungen:
Die Applikation, die auf die Informationen zugreift, muss registriert sein.
Die Applikation muss die richtigen Zugriffsberechtigungen haben.
Registrieren der Anwendung in Azure AD
Während man im Internet noch viele Einträge findet, dass die Applikation über das App-Registrierungsportal registrieren soll, hat sich für mich der Weg direkt aus https://portal.azure.com heraus als der bequemere Weg erwiesen. Für diejenigen, die es jedoch auch weiterhin über das App-Registrierungsportal vornehmen wollen oder müssen, hier noch einmal der Link:
Sie finden das neue Tool innerhalb des Azure-Portals unter Azure Active Directory -> App-Registrierungen (Vorschau).
Ein Klick auf Neue Registrierung startet den Neueintrag für eine neu zu registrierende Anwendung:
Tragen Sie den Namen der Applikation in das Feld Name ein.
Unter Unterstützte Kontotypen wählen Sie, ob die Anwendung auch außerhalb des aktuellen Tenants zur Verfügung soll, andere Tenants darauf zugreifen dürfen, oder auch eine Anmeldung über ein Microsoft Konto möglich sein soll.
Nur Konten in diesem Organisationsverzeichnis (Standardverzeichnis)
Alle Benutzer- und Gastkonten in Ihrem Verzeichnis können Ihre Anwendung oder API verwenden.
Verwenden Sie diese Option, wenn Ihre Zielgruppe sich innerhalb Ihrer Organisation befindet.
Konten in einem beliebigen Organisationsverzeichnis
Alle Benutzer und Gäste mit einem Geschäfts-, Schul- oder Unikonto von Microsoft können Ihre Anwendung oder API verwenden. Dazu gehören auch Bildungseinrichtungen und Unternehmen, die Office 365 verwenden.
Verwenden Sie diese Option, wenn Ihre Zielgruppe Kunden aus dem Unternehmens- oder Bildungsbereich sind.
Konten in allen Organisationsverzeichnissen und persönliche Microsoft-Konten (z. B. Skype, Xbox, Outlook.com)
Alle Benutzer mit einem Geschäfts-, Schul- oder Unikonto bzw. einem persönlichen Microsoft-Konto können Ihre Anwendung oder API verwenden. Dazu gehören Bildungseinrichten und Unternehmen, die Office 365 verwenden, wie auch persönliche Konten, die zur Anmeldung bei Diensten wie Xbox und Skype verwendet werden.
Mit dieser Option beziehen Sie die umfassendste Gruppe von Microsoft-Identitäten ein.
Aufgrund temporärer Unterschiede in der Funktionalität werden möglicherweise Fehler angezeigt, wenn Sie nach der Registrierung der Anwendung versuchen, zwischen unterstützten Zielgruppen zu wechseln.
Läuft die Anwendung als Webanwendung, wird als Umleitungs-URI gerne die URL der Webanwendung oder einer darunter liegenden Seiten angegeben – d.h. z. B. http://localhost:5050. Wie im Text angegeben, muss diese Angabe heute noch nicht zwingend hinterlegt werden – allerdings kommt es in vielen Fällen zu Fehlermeldungen, wenn hier kein Wert eingetragen ist.
Nach Klick auf Registrieren werden alle Optionen für die Konfiguration der Anwendung verfügbar.
Den erste wichtige Wert stellt die Anwendungs-ID dar. Diese werden Sie später für den Zugriff benötigen.
Die Konfiguration der Anwendungs- Registrierung
Drei weitere Einstellungen werden in den nächsten Schritten wichtig.
Das Secret / „Geheime Clientschlüssel“
Authentifizierung
API-Berechtigungen
Das Secret – Geheime Clientschlüssel
Unter Zertifikate und „Geheimnisse“ können Sie nun entweder ein Zertifikat hochladen oder ein sogenanntes Secret erstellen. Diese werden im späteren Verlauf für die Authentifizierung genutzt.
Das Bild unten zeigt die Erstellung eines Secrets („Geheime Clientschlüssel“).
Nach dem Klick auf Hinzufügen wird das Secret erstellt. Beachten Sie auf dem folgenden Fenster den Hinweis in der Kopfzeile:
„Kopieren Sie den Wert des neuen geheimen Clientschlüssels. Er kann nach dem Verlassen dieser Seite nicht mehr abgerufen werden.“
Hier empfiehlt es sich die Informationen (Applikations ID und Secret) an einer zentralen Stelle abzulegen.
Authentifizierungseinstellungen
Die nächste Seite stellt die Authentifizierungsseite dar. Hier wählen Sie, welche Dienste für die Authentifizierungsmöglichkeiten für die Anwendung zur Verfügung stehen.
Wenn Sie die Microsoft Authentication Library (MSAL) oder die Active Directory Authentication Library (ADAL) zum Erstellen von Anwendungen für Desktop- oder Mobilgeräte verwenden, können Sie einen der unten vorgeschlagenen Umleitungs-URIs auswählen oder oben einen benutzerdefinierten Umleitungs-URI eingeben. Weitere Informationen finden Sie in der Bibliotheksdokumentation.
Wichtig für die Anwendung ist auch die zweite Entscheidung: soll die Anwendung über ein Token zugreifen können, muss diese Option explizit aktiviert werden.
Ermöglicht einer Anwendung das Anfordern eines Tokens direkt vom Autorisierungsendpunkt. Dies empfiehlt sich nur, wenn die Anwendung eine Single-Page-Architektur (SPA) aufweist, keine Back-End-Komponenten umfasst oder eine Web-API über JavaScript aufruft.
API-Berechtigungen
Unter API-Berechtigungen geben Sie nun an, welche Berechtigungen die Anwendung beim Zugriff haben soll. Hier können Sie sehr filigran die Berechtigungen auf die unterschiedlichen Bereiche (Exchange, Azure AD, Kalender, Kontakte, Chat, …) einstellen.
Klicken Sie hierzu auf Berechtigung hinzufügen und wählen Sie den Bereich aus, für den Sie die Berechtigungen erteilen möchten.
Aktivieren Sie die entsprechenden Berechtigungen. Auf der rechten Seite neben den Berechtigungen sehen sie, ob nach der Aktivierung der Berechtigung eine „Einwilligung“ durch einen Administrator notwendig ist. Sollte das notwendig sein, können Sie diese nach dem Speichern der Änderungen über den Punkt Administratorzustimmung für das Standardverzeichnis erteilen sofort zentral ausführen.
Sollte eine Zustimmung durch einen Adminstratoren (Consent) notwendig sein, können Sie diese nach dem Speichern der Änderungen über den Punkt Administratorzustimmung für das Standardverzeichnis erteilen sofort zentral ausführen.
Ein Beispiel (C#)
In diesem Beispiel soll aus Azure AD ein Benutzer herausgesucht werden. Diese Aufgabe übernimmt Graph_Find_User. Als Parameter wird der _userPrincipalName des zu suchenden Benutzers und das Token (die Erstellung des Tokens wird weiter unten beschrieben) für den Zugriff übergeben
Für die Ausführung der Suche nutze ich ein HttpRequestMessage. Diese bekommt als Parameter „Get“ sowie die im Graph-Explorer ausgetestete URL https://graph.microsoft.com/v1.0/users/<User> mit.
Test der Abfrage im Graph Explorer
Dazu wird die String-Variable graphRequest aus dem Pfad zum Graph und den Parametern /User/ und <_userPrincipalName> zusammengesetzt.
In Zeile 14 wird über einen Header json als Format „vereinbart“.
In Zeile 15 wird der übergebene Token in die Abfrage als Header übernommen.
public ADAccount Graph_Find_User(string _userPrincipalName, string _token)
{
string _userID = string.Empty; string _graphString = "https://graph.microsoft.com/v1.0/";
string _status = string.Empty;
using (var _client = new HttpClient())
{
string graphRequest = _graphString+ "users/"+_userPrincipalName;
Uri _requestUri = new Uri(graphRequest);
using (var _request = new HttpRequestMessage(HttpMethod.Get, graphRequest)) // endpoint + queryParameter = graphRequest
{
_request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
_request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _token); ;
Task<HttpResponseMessage> _response = _client.SendAsync(_request);
_response.Wait();
var _responseTextTask = _response.Result.Content.ReadAsStringAsync();
_responseTextTask.Wait();
ADAccount _myAccount = new ADAccount();
_myAccount = JsonConvert.DeserializeObject<ADAccount>(_responseTextTask.Result);
return _myAccount;
}
}
}
Als Antwort lese ich die aus dem Graph-Explorer heraus schon zu erwartende JSON-Rückmeldung (Zeile 20/21), die ich (Zeile 23 / 24) in eine passende Klasse (ADAccount) einlese. Die Struktur der Klasse entspricht der aus dem Graph Explorer erwarteten Antwort:
Die Klasse ADAccount:
public class ADAccount
{
public IList<string> businessPhones { get; set; }
public string displayName { get; set; }
public string givenName { get; set; }
public string jobTitle { get; set; }
public string mail { get; set; }
public string mobilePhone { get; set; }
public string officeLocation { get; set; }
public string preferredLanguage { get; set; }
public string surname{ get; set; }
public string userPrincipalName { get; set; }
public string id { get; set; }
}
Authentifizierung (Token)
Um die Anwendung authentifizieren zu können (ich hatte bei der Registrierung der Anwendung die Option „Token“ aktiviert), benötige ich ein Token.
Dieses erstelle ich über _authContext.AcquireTokenAsync(Zeile 25).
Da meine Anwendung inzwischen einen etwas größeren Umfang angenommen hat, sind die meisten Konfigurationsparameter inzwischen in einer Azure SQL Datenbank gespeichert. Diese lese ich mir im ersten Teil in _cfgParams(Zeile 11) ein. In der Struktur liegen nach dem Einlesen Informationen wie die Benutzer-Domäne (Domain.onmicrosoft.com), die URL für Microsoft Graph, die APP ClientID (aus der Registrierung der Anwendung) sowie das App Secret (ebenfalls aus der Registrierung der Anwendung).
Da die App ID und das Secret in der Datenbank verschlüsselt abgelegt sind, müssen beide entschlüsselt werden. Das erledigt bei mir eine zentrale Funktion _mwPE.DecryptWithByteArray (Zeile 21). Hier könnte z. B. die Version von diesem Link genutzt werden. Haben Sie die App ID und das Secret lokal in einem String, kann das natürlich entfallen.
Der eigentliche Aufruf von AcquireTokenAsync erfolgt eigentlich async (Zeile 24). Leider hat das in meiner Konstellation zu einem Problem geführt. Daher habe ich mich entschieden, den Aufruf etwas umzuformulieren und über Task<> den Ablauf zu steuern. Hat alles funktioniert, erhalten Sie hier das Token, das beim Aufruf von Graph_Find_User neben dem _userPrincipalName übergeben wird.
private async Task<string> AppAuthenticationAsync()
{
// Constants
mwHelper.PasswordEncoder _mwPE = new mwHelper.PasswordEncoder();
try
{
GetFromWS _getFromWS = new GetFromWS();
Config_Parameter _cfgParams = new Config_Parameter();
_cfgParams = _getFromWS.Get_Cfg_Parameters();
var _tenant = _cfgParams._userDomain; // "Domain.onmicrosoft.com";
var _resource = _cfgParams._ADAppResource; // https://graph.microsoft.com/";
var _clientID = _cfgParams._ADAppClientID;
var _secret = _cfgParams._ADAppSecret;
var _authority = _cfgParams._ADAppAuthority + _tenant; // $"https://login.microsoftonline.com/{tenant}";
var _authContext = new AuthenticationContext(_authority);
var _credentials = new ClientCredential(_mwPE.DecryptWithByteArray(_clientID), _mwPE.DecryptWithByteArray(_secret));
// var _authResult = await _authContext.AcquireTokenAsync(_resource, _credentials);
Task<AuthenticationResult> _authResult = _authContext.AcquireTokenAsync(_resource, _credentials);
_authResult.Wait();
return _authResult.Result.AccessToken;
}
catch (Exception ex)
{
return ("Fehler bei der Erstellung des Accesstokens" + ex.Message);
}
}
Eigentlich war damit nicht viel Code notwendig, um einen Benutzer in Azure AD zu suchen.
Die Zeit, die ich damit verbracht hatte, die Puzzle-Steine zusammenzufügen war eher dem Lesen und Suchen geschuldet, da der Teufel wie immer im Detail liegt.
Ich hatte in meinem Blog mal irgendwann geschrieben, dass ich kein Entwickler wäre – dazu stehe ich noch heute. Insofern soll das Beispiel nur eine Hilfestellung sein, wie ein Einstieg gelingen kann – es ist mit Sicherheit kein Code, der allen kritischen Sichten und Anforderungen genügt.
Im übrigen muss ich hier vielen Kollegen für die Code-Schnipsel danken. Viele Bausteine, die auch in mein Beispiel eingeflossen sind, fand ich unter https://vincentlauzon.com, stackoverflow.com (eine wirklich großartige und hilfreiche Seite), oder auch https://dasow.com.
Eine wichtige Voraussetzung für den Code ist die Einbindung unterschiedlicher NuGet-Pakete. Ich habe in meiner gesamten Lösung folgende Pakete eingebunden:
Wählen Sie die Plattform, mit der Sie starten wollen.
In Schritt 2 wird registrieren Sie die – für den Zugriff notwendige – App ID. Ich werde darauf in einem neuen Blogeintrag noch einmal detaillierter eingehen.
Die App ID benötigen Sie später bei der Erstellung der APP noch einmal. Am besten gleich kopieren und irgendwo für den späteren Zugriff speichern.
Als nächstes können Sie die Solution für Visual Studio 2017 herunterladen.
Entpacken Sie die Solution (msgraph-training-uwp.zip). Im Verzeichnis der Solution finden Sie eine Readme.md. Diese erläutert die nächsten Schritte:
To run the completed project in this folder, you need the following:
[Visual Studio](https://visualstudio.microsoft.com/vs/) installed on your development machine. If you do not have Visual Studio, visit the previous link for download options. (**Note:** This tutorial was written with Visual Studio 2017 version 15.81. The steps in this guide may work with other versions, but that has not been tested.)
Der nächste Schritt – laut Readme.md – ist die Anpassung der durch die Tutorial-Site durchgeführte Registrierung:
Register a native application with the Application Registration Portal
Open a browser and navigate to the [Application Registration Portal](https://apps.dev.microsoft.com) and login using a **personal account** (aka: Microsoft Account) or **Work or School Account**.
Select the APP.
On the **Register your application** page, set the **Application Name** to **UWP Graph Tutorial** and select **Create**.
On the **UWP Graph Tutorial Registration** page, under the **Properties** section, copy the **Application Id** as you will need it later.
Scroll down to the **Platforms** section.
Select **Add Platform**.
In the **Add Platform** dialog, select **Native Application**.
Scroll to the bottom of the page and select **Save**.
Nun kann die Solution geöffnet werden. Es fallen sofort die „Fehlermeldungen“ ins Auge:
Wie in der Readme.md beschrieben, muss man kleinere Anpassungen machen, damit die Ausführung gelingt:
Open `graph-tutorial.sln` in Visual Studio.
Edit the `OAuth.resw` file in visual studio.Replace `YOUR_APP_ID_HERE` with the **Application Id** you got from the App Registration Portal.
In Solution Explorer, right-click the **graph-tutorial** solution and choose **Restore NuGet Packages**.
Danach können Sie das Projekt ausführen.
Bei der ersten Anmeldung kommt ein entscheidender Punkt. Wurde in Azure (z. B. durch den Administrator) noch kein „Consent“ erteilt, wird für die APP nun nachgefragt, ob die Berechtigungen für die APP akzeptiert werden. Die Berechtigungen müssen spätestens jetzt durch einen Klick auf „Akzeptieren“ erteilt werden.
Möchte man sich mit Microsoft Graph aus Entwickler-Sicht nähern, dann ist – neben der API Reference und den Dokumenten – Microsoft Graph Explorer eine sehr gute Möglichkeit. Man findet ihn auf der Developer-Site für Microsoft Graph.
„The Microsoft Graph explorer is a tool that lets you make requests and see responses against the Microsoft Graph.„
Bereits ohne Anmeldung hat man hier die Möglichkeit, erste Erfahrungen zu sammeln. Im ersten Schritt werden ein paar Beispiel-Anfragen am linken Rand angezeigt. Diese drehen sich um den eigenen Benutzer – ohne Anmeldung um einen Demo-Benutzer. Man findet dort vordefinierte Abfragen zum Profil, zum Profilbild, zu E-Mails oder zu Elementen in OneDrive. Wählt man eine der Abfragen aus, wird in der Query-Zeile die entsprechende Anfrage angezeigt.
In der Response-Anzeige bekommt man die Antworten angezeigt.
Möchte man eine Übersicht über die Bandbreite von Microsoft Graph bekommen, klickt man auf den kleinen Link unterhalb der Liste der vorgefertigten Abfragen „show more samples„. Nun kann man aus der Fülle der Funktionen wählen – alles, was das Herz begehrt…
Auswahl der Beispielkategorien im Graph Explorer
Damit öffnet man sich z. B. auch Zugriff auf Abfragen rund um die angelegten Benutzer.
Ein kurzer Blick in die API Reference hilft einem dabei, etwas mit den Queries spielen zu können…
„You can access users through Microsoft Graph in two ways:
By their ID, /users/{id | userPrincipalName}
By using the /me alias for the signed-in user, which is the same as /users/{signed-in user's id}"
So kann man direkt an „/users/“ den Namen eines Accounts anfügen und bekommt als Antwort dann die entsprechenden Informationen zurück.
Je nach Modul tauchen nun auch nicht mehr nur die Methode „GET“ in den Beispielen auf. Man findet nun auch Beispiele für „POST“ und „PATCH“ – d.h. z. B. für das Anlegen eines Benutzers oder Ändern von Benutzereigenschaften. Diese können aber erst getestet werden, wenn man sich mit einem Microsoft Account angemeldet hat.
Sobald man sich Gedanken darüber macht, wie man innerhalb der Microsoft Cloud automatisiert auf Informationen (wie z. B. Benutzer) zugreifen kann, stößt man – neben Powershell – schnell auf das Thema Microsoft Graph. Es ist die zentrale Drehscheibe für den programmatischen Zugriff. Es stellt eine Reihe von REST APIs zur Verfügung, mit deren Hilfe man auf Daten in den unterschiedlichen Cloud Services zugreifen kann (Azure Active Directory, Office 365, Enterprise Security and Mobility mit Intune, Identity Manager, Dynamics CRM, Windows 10 Services etc.)
Wir verwenden Cookies, um unsere Website und unseren Service zu optimieren.
Funktionale Cookies
Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt.Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Neueste Kommentare