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

qxgroojn  于 2022-11-17  发布在  C#
关注(0)|答案(4)|浏览(183)

我需要调用Microsoft Graph API在Azure AD中创建用户。
首先,我需要从控制台应用程序进行测试,然后需要在Azure中实现功能。
https://developer.microsoft.com/en-us/graph/graph-explorer
我是微软图形API的新手,我如何从C#控制台应用程序连接和执行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);

我尝试使用现有的AADB 2C. b2c-extensions-app。请勿修改。AADB 2C使用它来储存使用者数据。
我已将权限启用为:

我既没有获得异常也没有获得访问令牌,程序以静默方式退出
还有:
有新的库

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

我如何直接登录而不弹出登录窗口,并获得令牌以下?PublicClientApplication

dojqjjoe

dojqjjoe1#

我假设您已经拥有Azure AD应用程序并获得了管理许可。
若要从主机应用程序连接,您需要先获取有效的令牌。由于您缺少UI,您需要在没有用户的情况下获取访问权限。请注意,这种“仅限应用程序”令牌需要管理员同意才能使用。
然后,必须向dotnet项目添加两个NuGet依赖项

<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()

更新2020.01

有一个新的包Microsoft.Graph.Auth,它简化了身份验证和令牌管理。
假设这次您要使用一些Beta API。
第一次

iaqfqrcu

iaqfqrcu2#

若要从主机应用连接,您需要首先获取有效令牌。由于您缺少UI,因此需要Get access without a user。* 请注意,此类型的“仅限应用”令牌需要Administrative Consent才能使用。*
为了支持Create User方案,您需要确保您的permission scopes包含User. ReadWrite. All。
一旦你有了一个有效的令牌,你就可以调用Graph API。Graph是一个REST API,所以所有的调用都是通过HTTP进行的,令牌在授权头中传递。
你可以在Get started with Microsoft Graph and REST上阅读一个概述。也有一些语言/框架的概述,但它们都假设你有一个UI(即不仅仅是控制台)。一般来说,如果你正在寻找一个控制台工具来创建用户,你可能更喜欢使用PowerShell

wgeznvg7

wgeznvg73#

这个问题已经很老了,但当我需要做同样的事情时,它是第一个蹦出来的问题之一。下面我将记录我用来实现它的步骤和资源:
1.我使用了O365租户(您可以从www.example.com获得一个租户office.com-请注意,您可以获得一年的开发人员试用版)。一旦您拥有了租户,如果您以租户管理员用户身份登录,则还可以访问Azure门户。在Azure门户下,转到Active Directory/属性以查看租户ID。
1.我按照这里的说明https://learn.microsoft.com/en-us/azure/active-directory/develop/quickstart-v2-netcore-daemon创建了一个新的注册应用程序。我创建了一个新的机密并复制了该值(这将是您的控制台应用程序中的客户端机密)。注册的应用程序ID将是您的控制台应用程序中的客户端ID。
1.我克隆了上述链接中的github repo,并将appsettings中的值更改为上述步骤中提到的租户ID、客户端ID和客户端机密。
1.该存储库中的代码调用了一些方法,这些方法在.NETCore 2.1的ConfigurationBuilder中已不存在。我用以下代码行替换了这些代码行(可能有更好/更短的方法):
如果您有任何问题,请使用下面的方法进行解答:客户端ID =配置.获取部分(“客户端ID”).值.ToString();客户端密码是客户端密码的一部分,客户端密码是客户端密码的一部分。
1.你现在应该在你的租户中迭代用户了。你可以去图形资源管理器(https://developer.microsoft.com/en-us/graph/graph-explorer)找到更多的URL(在Program.cs中找到行来替换它们)。据我所知,API的v2.0是“beta”(把“beta”放在“v1.0”的地方-如果我说错了,请有人纠正我)。
如果您有任何问题,请与我们联系。

wbrvyc0a

wbrvyc0a4#

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());
        }
    }

相关问题