Passing User Agent in MSGraph ,NET SDK

%3CLINGO-SUB%20id%3D%22lingo-sub-3342587%22%20slang%3D%22en-US%22%3EPassing%20User%20Agent%20in%20MSGraph%20%2CNET%20SDK%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3342587%22%20slang%3D%22en-US%22%3E%3CP%3EI'm%20reading%20customer%20365%20email%20accounts%20using%20MSGraph%20SDK%204.27.0%20in%20C%23%20and%20it%20works%20fine%2C%20but%20one%20customer%20is%20using%20EWS%20allowlists%20which%20work%20by%20User%20Agent.%20How%20do%20I%20pass%20the%20User%20Agent%20string%20using%20the%20SDK%3F%20The%20code%20is%20from%20the%20MS%20Example%20using%20Azure%20ID%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-csharp%22%3E%3CCODE%3E%20%20%20%20%20%20%20%20%20%20%20%20var%20scopes%20%3D%20new%5B%5D%20%7B%20%22User.Read%22%2C%22Mail.ReadWrite%22%2C%22Mail.ReadWrite.Shared%22%20%7D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Multi-tenant%20apps%20can%20use%20%22common%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20single-tenant%20apps%20must%20use%20the%20tenant%20ID%20from%20the%20Azure%20portal%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20tenantId%20%3D%20%22organizations%22%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Value%20from%20app%20registration%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20theClientId%20%3D%20clientID%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20using%20Azure.Identity%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20options%20%3D%20new%20TokenCredentialOptions%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20AuthorityHost%20%3D%20AzureAuthorityHosts.AzurePublicCloud%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20userName%20%3D%20txtUserName.Text%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20password%20%3D%20txtPwd.Text%20%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20https%3A%2F%2Fdocs.microsoft.com%2Fdotnet%2Fapi%2Fazure.identity.usernamepasswordcredential%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20userNamePasswordCredential%20%3D%20new%20UsernamePasswordCredential(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20userName%2C%20password%2C%20tenantId%2C%20theClientId%2C%20options)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20graphClient%20%3D%20new%20GraphServiceClient(userNamePasswordCredential%2C%20scopes)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20try%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(string.IsNullOrEmpty(txtSharedAccount.Text.Trim()))%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rootFolder%20%3D%20await%20graphClient.Me.MailFolders%5B%22msgfolderroot%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.Request()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.GetAsync()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3C%2FCODE%3E%3C%2FPRE%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-3349776%22%20slang%3D%22en-US%22%3ERe%3A%20Passing%20User%20Agent%20in%20MSGraph%20%2CNET%20SDK%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3349776%22%20slang%3D%22en-US%22%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CDIV%20class%3D%22%22%3E%3CP%3EFound%20the%20answer%20from%20the%20GitHubs%20docs%20eventually%20although%20it%20did%20take%20some%20experimentation%20finding%20out%20that%20the%20header%20option%20name%20is%20%22User-Agent%22%20You%20create%20an%20options%20list%20and%20add%20in%20the%20user%20agent%20option%3C%2FP%3E%3CPRE%3E%20List%26lt%3BOption%26gt%3B%20theOptions%20%3D%20new%20List%26lt%3BOption%26gt%3B()%3B%0A%20%20%20%20%20%20%20%20theOptions.Add(new%20HeaderOption(%22User-Agent%22%2C%20%22MyUserAgentName%22))%3B%3C%2FPRE%3E%3CP%3EThen%20every%20.Request()%20call%20has%20to%20have%20the%20options%20as%20a%20parameter%20e.g.%3C%2FP%3E%3CPRE%3E%20rootFolder%20%3D%20await%20graphClient.Me.MailFolders%5B%22msgfolderroot%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.Request(theOptions)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.GetAsync()%3B%3C%2FPRE%3E%3C%2FDIV%3E%3C%2FLINGO-BODY%3E
New Contributor

I'm reading customer 365 email accounts using MSGraph SDK 4.27.0 in C# and it works fine, but one customer is using EWS allowlists which work by User Agent. How do I pass the User Agent string using the SDK? The code is from the MS Example using Azure ID

            var scopes = new[] { "User.Read","Mail.ReadWrite","Mail.ReadWrite.Shared" };

            // Multi-tenant apps can use "common",
            // single-tenant apps must use the tenant ID from the Azure portal
            var tenantId = "organizations";

            // Value from app registration
            var theClientId = clientID;

            // using Azure.Identity;
            var options = new TokenCredentialOptions
            {
                AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
            };

            var userName = txtUserName.Text;
            var password = txtPwd.Text ;

            // https://docs.microsoft.com/dotnet/api/azure.identity.usernamepasswordcredential
            var userNamePasswordCredential = new UsernamePasswordCredential(
                userName, password, tenantId, theClientId, options);

            var graphClient = new GraphServiceClient(userNamePasswordCredential, scopes);
            try
            {
                if (string.IsNullOrEmpty(txtSharedAccount.Text.Trim())) 
                {
                    rootFolder = await graphClient.Me.MailFolders["msgfolderroot"]
                    .Request()
                    .GetAsync();
                }
1 Reply

 

Found the answer from the GitHubs docs eventually although it did take some experimentation finding out that the header option name is "User-Agent" You create an options list and add in the user agent option

 List<Option> theOptions = new List<Option>();
        theOptions.Add(new HeaderOption("User-Agent", "MyUserAgentName"));

Then every .Request() call has to have the options as a parameter e.g.

 rootFolder = await graphClient.Me.MailFolders["msgfolderroot"]
                .Request(theOptions)
                .GetAsync();