我需要调用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用于存储用户数据。
我既没有得到异常也没有得到访问令牌和程序默默地退出
另外:
有新图书馆
<package id="Microsoft.Identity.Client" version="1.1.0-preview" targetFramework="net46" />
如何在没有登录弹出的情况下使用以下命令直接登录并获取令牌? PublicClientApplication
答案 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)
这个问题相当古老,但是当我最初需要做同样的事情时,这是第一个出现的问题。下面,我将记录实现该目标的步骤和资源:
该仓库中的代码具有一些调用的方法,从.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();
您现在应该遍历租户中的用户。您可以转到图形浏览器(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。