I had been working on it for a few weeks. The fact that all of us were under
lockdown gave me some extra time in the evenings and weekends to focus on
learning the Microsoft Teams platform and create an app on it which addressed
a gap which I noticed in my day to day use.
We all get a lot of Teams messages daily and need a way to manage them or come
back to them at a later time. Snooze bot helps us do exactly that. It lets us
Snooze message which we want to deal with later. When a message is snoozed, we
get an option to select the duration after which Snooze Bot should remind us
about the message. When the time arrives, the bot will send you personal
message in teams reminding about the snoozed message.
If you haven't checked out Snooze Bot yet, feel free to install it and give it
a try. I am happy to hear any feedback and potential improvements.
One of my goals when creating the app was to learn about the Microsoft Teams
developer platform and also blog about the interesting things I came across.
So in this series of posts, let's outline some Microsoft Teams development
concepts which I found really useful. The first one being posting an Adaptive
Card carousel as a welcome message when the bot is added by the user.
It's always recommended as a good practice to send a welcome message when the
user adds the bot. According to the Microsoft docs:
In personal contexts, welcome messages set your bot's tone. The message
includes a greeting, what the bot can do, and some suggestions for how to
interact (for example, “Try asking me about …”). If possible, these
suggestions should return stored responses without having to sign in.
Also, sending the welcome message one of the requirements before the app is accepted in AppSource by the validation team.
So we can send a simple chat message from the bot to the user as a welcome
message. So why go for an Adaptive Card carousel? This is because adding too
much information in a single message can get overwhelming for the user and
they might be tempted to just skip it. Also if your bot has a
lot of functionality you need a way to efficiently present that information to
the user. This is where carousels created by Adaptive Cards some into
play:
So let's have a look at the code which helps us send the welcome message in Snooze Bot
The Adaptive Card json:
First, we need to define the Adaptive cards which will show up in the welcome message. I am storing mine as json files in my solution. The cards contain helpful text and also links to images which show the functionality of Snooze Bot
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"text": "When the selected time arrives, I will send you a personal card reminding you about the snoozed message. From the personal card, either you can go directly to the Teams message or you can snooze the message again",
And here is the code where we do the following things:
1) Capture the OnMembersAddedAsync event from the Bot Framework
2) Get the Adaptive cards from the json files
3) Insert the adaptive cards into a Bot Framework carousel and send it to the user
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
And that's it. Whenever a user will download and install the app, the welcome message will be sent to them introducing your bot and it's funtionality.
Hope you found the post useful!
Creating multi-tenant (SaaS) apps in Microsoft 365 has been possible for a
while now. Azure AD multi tenant apps allow us to host our custom applications
in an Azure AD/M365 "home" tenant while enabling the apps to also have access
to resources hosted in other tenants. To know more about multi-tenant apps,
head over to the Microsoft docs: https://docs.microsoft.com/en-in/azure/active-directory/develop/single-and-multi-tenant-apps
Hosting applications in a home tenant as SaaS has a lot of advantages
particularly for ISVs when it comes to product based applications. Users are able to consume the apps directly by signing into
them instead of the conventional way of an admin having to deploy the product to the customer tenant first. It makes life easy for the admins as well as they don't have to go
through complex deployment scripts and instructions. Moreover, after the
application is deployed, new features and bug fixes can be rolled out to the
application "on the fly" as opposed to releasing feature packs and hotfixes
which again have to be installed manually.
So in this post, we are going to have a look at using the
Microsoft Graph API in such apps configured to be multi tenant.
(Multi tenant apps also allow users with personal Microsoft accounts to sign
into them but that is a topic for another day! Also, in this post we will only
focus on the application permissions i.e. granting permissions to applications
without a user context)
Configure an app to be a multi-tenant in the home tenant's Azure AD
1) When creating a multitenant app registration, make sure that the "Accounts
in any organizational directory" is selected. Also, we need to add a redirect
url as this will be the url the admin will be redirected to after
successfully granting consent to our application. Ideally, this would be the
landing page of your application but in the screenshot I am just using the AAD
home as an example:
2) Assign required permissions. In this case, we are going to demo the code to
get all the Microsoft 365 Groups on the tenant and also the root SharePoint Online site, so
selecting the relevant permissions here:
3) Create a client secret and record it along with the client id. We will need this later in our code.
Granting consent to a multi tenant app in other "consumer" tenant
Next, let's have a look at how the multi tenant app hosted in it's home tenant
can be granted permission to access resources in other tenants.
What we will have to do is to construct a url for admin consent which would be
unique to our application. An Azure AD admin of the other tenant will need to
navigate to the url and then consent to granting the permissions to our app on
the tenant. The Azure AD url will have the following structure:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
In the link above, replace the client id with the client id of your multi tenant Azure AD app. Also, notice that we are using the /.default static scope which means that all permissions configured in the app will be requested for consent.
When the admin navigates to this url, they will see the consent prompt:
Once the consent is granted, the multitenant app will have permissions to access the resources on the other tenant. This can be checked by going to:
Azure Active Directory > Enterprise Applications > All applications and searching for our app there.
This confirms that the multi tenant app has permissions on this tenant. Also this process can be repeated on any number of Azure AD/M365 tenants.
Use the Microsoft Graph API to get Microsoft 365 data from the consumer
tenant
With everything setup and also the admin consent granted, let's have a look at
the Microsoft Graph code to get data from the consumer tenant.
In this code, I am using the .NET SDK for Microsoft Graph found on nuget here:
And finally here is the code to get all the Microsoft 365 Groups and the
SharePoint root site url of the consumer tenant. For the sake of simplicity, I am using a .NET Core console application:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters