如何从控制台应用程序c#调用Microsoft Graph

时间:2017-07-10 14:00:42

标签: azure microsoft-graph

我需要调用Microsoft Graph API在Azure AD中创建用户。

首先,我需要从控制台应用程序进行测试,然后需要在Azure函数中实现。

https://developer.microsoft.com/en-us/graph/graph-explorer

我是Microsoft Graph API的新手,如何从c#console应用程序连接和执行API。

我已经在AAD注册了该应用程序。

我正在尝试获取令牌:

string resourceId = "https://graph.microsoft.com";
string tenantId = "<tenantID>";
string authString = "https://login.microsoftonline.com/" + tenantId;
string upn = String.Empty;
string clientId = "<ClientID>";
string clientSecret = "<clientSecret>";
//string clientSecret = ConfigurationManager.AppSettings["clientSecret"];


log.Verbose("ClientSecret=" + clientSecret);
log.Verbose("authString=" + authString);

var authenticationContext = new AuthenticationContext(authString, false);

// Config for OAuth client credentials 
ClientCredential clientCred = new ClientCredential(clientId, clientSecret);
AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(resourceId,clientCred);
string token = authenticationResult.AccessToken;
log.Verbose("token=" + token);

我尝试使用现有的AADB2C。 B2C的扩展应用程序内。不要修改。由AADB2C用于存储用户数据。

我已启用以下权限: enter image description here

我既没有得到异常也没有得到访问令牌和程序默默地退出

另外:

有新图书馆

 <package id="Microsoft.Identity.Client" version="1.1.0-preview" targetFramework="net46" />

如何在没有登录弹出的情况下使用以下命令直接登录并获取令牌? PublicClientApplication

5 个答案:

答案 0 :(得分:7)

要从控制台应用程序进行连接,您需要先获取有效令牌。由于您缺少用户界面,因此您需要Get access without a user请注意,此类“仅限应用”令牌需要Administrative Consent才能使用。

为了支持Create User方案,您需要确保permission scopes包含User.ReadWrite.All

获得有效令牌后,您可以调用Graph API。 Graph是一个REST API,因此所有调用都是通过HTTP在Authorization Header中传递的令牌进行的。

您可以在Get started with Microsoft Graph and REST阅读一般概述。还有一些语言/框架特定的概述可用,但所有这些都假设你有一个UI(即不仅仅是控制台)。一般来说,如果您正在寻找用于创建用户的控制台工具,您可能更喜欢使用PowerShell

答案 1 :(得分:4)

我假设您已经具有具有已授予管理同意的Azure AD应用程序。

  

要从控制台应用程序进行连接,您首先需要获取有效的令牌。由于缺少UI,因此您需要在没有用户的情况下获得访问权限。请注意,这种类型的“仅应用程序”令牌必须先获得管理许可,然后才能使用。

然后,您必须向NuGet项目中添加两个dotnet依赖项

<PackageReference Include="Microsoft.Graph" Version="1.15.0" />
<PackageReference Include="Microsoft.Identity.Client" Version="4.0.0" />

Microsoft.Identity.Client用于使用Azure AD进行身份验证,Microsoft.Graph用于执行MS Graph查询。

var tenantId = "you-azure-tenand-id";
var clientId = "azure-ad-application-id";
var clientSecret = "unique-secret-generated-for-this-console-app";

// Configure app builder
var authority = $"https://login.microsoftonline.com/{tenantId}";
var app = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithClientSecret(clientSecret)
    .WithAuthority(new Uri(authority))
    .Build(); 

// Acquire tokens for Graph API
var scopes = new[] {"https://graph.microsoft.com/.default"};
var authenticationResult = await app.AcquireTokenForClient(scopes).ExecuteAsync();

// Create GraphClient and attach auth header to all request (acquired on previous step)
var graphClient = new GraphServiceClient(
    new DelegateAuthenticationProvider(requestMessage => {
        requestMessage.Headers.Authorization = 
            new AuthenticationHeaderValue("bearer", authenticationResult.AccessToken);

        return Task.FromResult(0);
    }));

// Call Graph API
var user = await graphClient.Users["Me@domain.com"].Request().GetAsync()

答案 2 :(得分:1)

MSAL console app tutorial描述了在.NET控制台应用中使用MSAL(Microsoft身份验证库)获取令牌。

要进行Microsoft Graph调用,我用此替换了RunAsync()函数,该函数使用GraphServiceClient将获取的标记附加到请求:

static async Task RunAsync()
    {
        const string clientId = "your client id";
        string[] scopes = { "User.Read" };
        AuthenticationResult result;

        var clientApp = new PublicClientApplication(clientId);
        try
        {
            result = await clientApp.AcquireTokenAsync(scopes.Split(new char[] { ' ' }));
            Console.WriteLine(result.AccessToken);
            GraphServiceClient graphClient = new GraphServiceClient(
                new DelegateAuthenticationProvider(
                    async (requestMessage) =>
                    {
                        // Append the access token to the request.
                        requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", result.AccessToken);

                        // Some identifying header
                        requestMessage.Headers.Add("SampleID", "aspnet-connect-sample");
                    }));

            // Get a page of mail from the inbox
            var inboxMail = await graphClient.Me.MailFolders.Inbox.Messages.Request().GetAsync();
            foreach(var mail in inboxMail.CurrentPage.ToList())
            {
                Console.Write("From: {0}\nSubject: {1}\nBody:\n{2}\n--------------------\n", mail.From.EmailAddress.Address, mail.Subject, mail.BodyPreview);
            }
        }

        // Unable to retrieve the access token silently.
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

答案 3 :(得分:0)

这个问题相当古老,但是当我最初需要做同样的事情时,这是第一个出现的问题。下面,我将记录实现该目标的步骤和资源:

  1. 我曾经使用过O365租户(您可以从office.com租用一个-请注意,您可以得到为期一年的开发人员试用)。拥有租户后,如果以租户管理员用户身份登录,您还可以访问Azure门户。在Azure门户下,转到Active Directory /属性以查看租户ID。
  2. 我按照https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-v2-netcore-daemon此处的说明创建了一个新的注册应用程序。我创建了一个新机密并复制了该值(这将是您的控制台应用程序中的客户端机密)。注册的应用程序ID将是您的控制台应用程序中的客户端ID。
  3. 我在上面的链接中克隆了github存储库,并将appsettings中的值更改为上述步骤中记录的租户ID,客户端ID和客户端密码。
  4. 该仓库中的代码具有一些调用的方法,从.NETCore 2.1开始,这些方法在ConfigurationBuilder中不再存在。我替换了以下几行(可能是更好/更短的方法):

    authenticationConfig.Tenant = Configuration.GetSection(“ Tenant”)。Value.ToString();             authenticationConfig.ClientId = Configuration.GetSection(“ ClientId”)。Value.ToString();             authenticationConfig.ClientSecret = Configuration.GetSection(“ ClientSecret”)。Value.ToString();

  5. 您现在应该遍历租户中的用户。您可以转到图形浏览器(https://developer.microsoft.com/en-us/graph/graph-explorer)查找更多URL(在Program.cs中找到该行以替换它们)。据我到目前为止所知,API的v2.0是“ beta”(将“ beta”表示为“ v1.0”,如果我错了,请纠正我)。

    等待apiCaller.CallWebApiAndProcessResultASync(“ https://graph.microsoft.com/v1.0/users”,result.AccessToken,Display);

答案 4 :(得分:0)

  

注意

     

您必须使用Azure AD Graph API来管理Azure AD B2C中的用户   目录。这与Microsoft Graph API不同。学到更多   here

在GitHub上有一个很好的示例项目:AzureADQuickStarts/B2C-GraphAPI-DotNet,它是附带的文档here