Search code examples
c#microsoft-graph-apiazure-functions

Executing POST request for Microsoft Graph API to add members to an AD group


I am trying to add members to an AD groups invoking Microsoft Graph API through an Azure Function

It is very easy and straightforward to execute GET requests through Graph API's, but I can't find any examples how I could execute post requests for the Graph API

I do have an example of a post request for the Graph API which is

POST https://graph.microsoft.com/v1.0/groups/{id}/members/$ref
Content-type: application/json
Content-length: 30

{
  "@odata.id": "https://graph.microsoft.com/v1.0/directoryObjects/{id}"
}

Here is the code I successfully use to retrieve the Graph response

public static async Task<HttpResponseMessage> GetDirectoryUsers(string graphToken, TraceWriter log, string displayName)
{
    HttpClient client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", graphToken);

    string requestUrl = "https://graph.microsoft.com/v1.0/groups?$top=2&$filter=displayName eq '" + displayName + "'&$expand=Members";
    var request = new HttpRequestMessage(new HttpMethod("GET"), requestUrl);
    var response = await client.SendAsync(request);
    return response;
}

However, I am completely lost how I could execute the request through a C# code within the Azure function to ADD the retrieved users to another AD. How can construct the request URL? How should I handle the odata id within that request URL?

If anyone could help me in any way, I would greatly appreciate it


Solution

  • Here is the answer that worked for me

    public static async Task<string> AddGroupMember(string accessToken, string groupId, string memberId)
    {
        var status = string.Empty;
        try
        {
            string endpoint = "https://graph.microsoft.com/v1.0/groups/" + groupId + "/members/$ref";
            string queryParameter = "";
    
            // pass body data 
            var keyOdataId = "@odata.id";
            var valueODataId = "https://graph.microsoft.com/v1.0/directoryObjects/" + memberId;
    
            var values = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>(keyOdataId, valueODataId)
    };
            var jsonData = $@"{{ ""{keyOdataId}"": ""{valueODataId}"" }}";
            var body = new StringContent(jsonData, Encoding.UTF8, "application/json");
    
    
            using (var client = new HttpClient())
            {
                using (var request = new HttpRequestMessage(HttpMethod.Post, endpoint + queryParameter))
                {
                    request.Content = body;
                    request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
    
                    using (var response = await client.SendAsync(request))
                    {
                        if (response.StatusCode == HttpStatusCode.NoContent)
                            status = "Member added to Group";
                        else
                            status = $"Unable to add Member to Group: {response.StatusCode}";
                    }
                }
            }
        }
        catch (Exception ex)
        {
            status = $"Error adding Member to Group: {ex.Message}";
        }
    
        return status;
    }