Support for Azure Managed Service Identity against Group resources - microsoft-graph-api

I've been testing the new managed service identity (https://learn.microsoft.com/en-us/azure/app-service/app-service-managed-service-identity) and I can get a bearer token for the service identity just fine.
I have tried to add the service principal as an owner of an O365 Group, and tried to use the service principal to update the Group photo, but I get access denied. I did manage to list a group just fine.
I figured since app-only tokens won't work for updating a Group image, then a service principal might work as a work around.
My question is, would this be a supported scenario in the future as I don't want to use a regular account as a service account to work around this limitation.

Related

Set a Role Condition to invoke a Cloud Run service

I want to enable a service account to invoke a Cloud Run service and restrict the invocation to a specific URL (eg.: https://myservice/specific).
Most of GCP resources allow for conditional restrictions using IAM Conditions (like picture below).
I'm wondering if Cloud Run does support IAM Conditions, and I case it does not what's the recommended way to achieve such kind of restriction.
Thanks.
IAM service is a free Google Cloud product that manage IAM access for Google Cloud product.
That being said, go back to your case: You have a service account that you want to restrict (or allow) the access to Cloud Run product. No problem, you can grant the run.invoker role to access to Cloud Run.
If you want finer/inner Cloud Run service permission, you should guess that it is not possible with IAM service. Indeed, the inner permission (or business permission) are specific to your code, and not to the Google Cloud code (i.e. the Google Cloud products).
And IAM Conditions won't help you in that case. IAM Conditions applies on Google Cloud product definition. For instance, you can grant a service account to access to Cloud Run services with the service name starting by something. But again, it's only on Google Cloud product information.
IAM can't help you on that. You could have a look at API Gateway. Or, you should have to implement the checks directly in the /path code to filter the authorized calls.
Based on this link, you can grant your Service Account a "Cloud Run Invoker" role.
You can read this link for more information.
I've tried to add the role "Cloud Run Invoker" to a user and it works. Just try it to a service account.
The service accountIAM permission,you can achieve this while deploying/editing a service you have the option to select "Allow only authenticated requests". This would basically do two things, one is restrict access to users listed within the IAM permissions list of the project. Secondly, you'd be able to give invocation permissions to email addresses and/or email domains Documentation here.As also can be inferred from the documentation here, frontend can securely and privately invoke backend by leveraging the Invoker IAM role:
Grant the service account of frontend the Cloud Run Invoker IAM role.
When you issue request from frontend to backend, you must attach an identity token to the request, see here for code examples
While there are other options to authenticate to Cloud Run services whose "Require authentication" option is turned on, all of the options issue and use a Google-issued token one way or another. That's because the option "Require authentication" uses IAM to secure Cloud Run services

Keycloak - how to get service account roles in client credentials access token

I want a backend app to use another backend service's API, and control per app what it is authorized to call on the backend service. I am using OAuth 2.0 client credentials flow and Keycloak as the authorization server.
I expect roles defined for the backend service and set for the backend app to appear in the access token I request from Keycloak. But the only thing I can manage to appear, are realm level client scopes.
I tried the following (I don't expect to need all of this, but I wanted to try anything that made a little sense):
created realm Test
added client scope on the realm (realm-clientscope1)
added roles on the realm (realm-role1, realm-role2)
define client "backend-service", made this a "bearer-only" client since it doesn't have to authorize itself to other services
create roles on this client (backendservice-role1, backendservice-role2, backendservice-role3-comp)
define client "backend-app", made this a confidential client, with service account enabled
added role on this client (backendapp-role1)
assigned realm-clientscope1 as a default scope
on the scope tab (backend-app Scope Mappings), turned off "Full Scope Allowed", assigned realm-role1, realm-role2, and client roles backendservice-role1, backendservice-role2, backendservice-role3-comp
assigned service account roles with the same roles as on the scope tab (realm-role1, realm-role2, and client roles backendservice-role1, backendservice-role2, backendservice-role3-comp)
After all this, I used Postman to get an access token for grant_type client-credentials. The only thing on the access token is the realm scope "realm-clientscope1".
Why all these options to set service account roles, etc. If they don't show up?
I assume I am misunderstanding how roles are used, but I can't find a proper explanation either.
To try and cover all bases, I also turned on Authorization Enabled on the "backend-app" client, and under authorization, tried to define authorization scopes, policies and permissions that made some sense.
This too, did not result in any more authorization info appearing on the access token.
The last thing I tried, is changing my "backend-service" app from "bearer-only" to "confidential" with Service Accounts Enabled. This also did not make a difference (as expected).
Keycloak version is 15.1.0 (thanks for asking, dreamcrash).
A little late, but I hope that it can be helpful to someone having the same problem.
Basically, it's necessary go to Client scopes tab, and add roles to default scope.
Notice that desired role must be setted in both Scope and Service account roles tabs or it can be setted Allow full scope in Scope tab, and then just set the desired role in Service account roles tab.
EDIT: I forgot to say these configurations must be set in client.
So, in my JWT token, I can see the role:

Revoking admin consent for a Microsoft Chat Bot

I have created a microsoft chat bot, and have set up the /adminconsent workflow, where another application has given admin consent to my bot to act on behalf of them.
#shawn-tabrizi wrote a great article about how to remove my own bot's access to their application from the UI, but I can't find a way to remove access using Microsoft Graph.
Any help would be appreciated!
I believe you're looking for Delete an appRoleAssignment granted to a service principal:
App roles which are assigned to service principals are also known as application permissions. Deleting an app role assignment for a service principal is equivalent to revoking the app-only permission grant.

"The tenant for tenant guid ... does not exist" when using client credentials flow (daemon) to access Microsoft Graph API

I want to access Microsoft Graph periodically from a console application in order to copy messages from an Outlook mailbox to a database.
In order to authenticate programmatically, I had to use the Microsoft Graph's "Client Credentials Flow".
These are the steps I had to take:
Register an App in the Azure portal and create a Client Secret for it.
Add all the permissions I need and grant them access:
Have an Admin confirm those permissions by accessing it for the first time. This is done using the following URL:
https://login.microsoftonline.com/{tenant}/v2.0/adminconsent
?client_id={app id}
&state=1234
&redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient
&scope=https://graph.microsoft.com/.default
I received the following response:
admin_consent: True
tenant: ca566779-1e7b-48e8-b52b-68**********
state: 12345
scope**: scope: https://graph.microsoft.com/User.Read https://graph.microsoft.com/.default
(The scope might explain the problem described later here: Why do I only get User.Read when I've configured 13 different permissions??)
Get an access token (with success!):
Try to read users (with success):
Try to read my own emails (without success):
Try to read somebody else's emails (the user was invited to access the app as a guest, but still, no success):
I don't understand why I can't read Messages but I can read Users. It seems the permissions were completely ignored (I confirmed that I don't need any permission to read the users).
UPDATE
This is my tenant name:
These are the users added to the tenant:
Important: I don't own an office 365 subscription in my Azure AD. All these emails belong to a different AD.
The previous question "The tenant for tenant guid does not exist" even though user is listed on users endpoint? is similar to mine but I believe this is not a duplicate as my problem is slightly different and the proposed solution uses OAuth1 (I am using OAuth2).
Microsoft Graph can only access data within the tenant you have authenticated to. This means that you cannot access a mailbox from another tenant, even if that User is a guest in the tenant you authenticated to. Allowing this would violate the fundamental principle of data isolation in AAD/O365 tenants.
It is also important to note that AAD/O365 and Outlook.com are distinct platforms. Microsoft Graph's core value prop is a common API layer across AAD and MSA, but under the covers, they are calling into distinct backends.
Beyond data isolation and these being distinct platforms, Outlook.com simply does not support Application Permissions (Client Credentials). You can only access Outlook.com using delegated permissions, and even only a limited set of scopes are supported:
Not all permissions are valid for both Microsoft accounts and work or school accounts. You can check the Microsoft Account Supported column for each permission group to determine whether a specific permission is valid for Microsoft accounts, work or school accounts, or both.
With regards to which scopes are included, I suspect the issue here is that you don't have a license for O365 in this tenant. If it allowed you to consent without a subscription, this could (in theory) lead to apps unexpectedly receiving consent when/if a subscription got added later. That said, it is hard to tell without seeing an example of an actual token you're getting back (feel free to post one of you'd like me to look into this more).
Finally, juunas is also correct with regards to /me. The /me segment is an alias for "the currently authenticated user". Since you are not authenticating a user when you use Client Credentials, /me is effectively null.
/me won't work with a client credentials token.
What would /me refer to? There is no user involved so it cannot mean anything.
For the second problem, does this user have an Exchange Online mailbox in your tenant?
The accepted answer is the one that helped me out. However, I ended-up testing what I needed to test joining the :
Office 365 Developer Program (free)
This program will allow you to create an Azure Active Directory with up to 25 email accounts. It also allows you to create 16 fictitious email accounts with emails inside (by clicking one single button). You can use this infrastructure for 90 days for free.

Azure Keyvault: Getting forbidden error if user is having direct access via Group to Key Vault

When we are trying to retrieve secret from keyvault using KeyVaultClient (c#) we are getting 403 access denied even though the same user can access the vault secret from Azure Portal. If we give explicit access to the user on key vault then we are able to retrieve the secrets. This looks like an issue and please help on possible workarounds.
You may not have a service principal created for your application yet. If so, create that first and then use the object ID of the service principal to authorize access for the application. If you are using a VM you also need to add the VM service principal to the Keyvault's policies.
Take a look at this sample code to see how to create application and service principal and give permission to the service principal.
This was due to while generating token Group claims were not getting set and hence key vault was checking only of direct permissions. Once we enable group claims by following these steps from here then it is working fine now ..

Resources