在方法中引用方法的结果
Reference the result of a method in a method
我有两种方法,第一种获取访问令牌以访问 AzureAD,第二种应该获取用户数据。当代码都在同一个方法中时,我能够让它工作,但我想最终添加命令行参数来调用不同的方法,所以我试图将授权部分分开并在另一个时调用方法被调用。这是我目前所拥有的。
using Microsoft.Identity.Client;
using System;
using System.Threading.Tasks;
using System.Configuration;
using System.Net.Http.Headers;
using PublicClientApplication = Microsoft.Identity.Client.PublicClientApplication;
namespace SharpZure
{
class SharpZure
{
static void Main(string[] args)
{
Auth().GetAwaiter().GetResult();
Console.ReadKey();
}
static async Task Auth()
{
var clientApp = PublicClientApplicationBuilder.Create(ConfigurationManager.AppSettings["clientId"]).Build();
string[] scopes = new string[] { "user.read" };
string token = null;
var app = PublicClientApplicationBuilder.Create(ConfigurationManager.AppSettings["clientId"]).Build();
var accounts = await app.GetAccountsAsync();
AuthenticationResult result = await app.AcquireTokenInteractive(scopes)
.ExecuteAsync();
token = result.AccessToken;
GraphServiceClient graphClient = new GraphServiceClient(
"https://graph.microsoft.com/v1.0",
new DelegateAuthenticationProvider(
async (requestMessage) =>
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);
}));
}
static async Task UserData()
{
Console.WriteLine("Display user details");
var currentUser = await graphClient.Me.Request().GetAsync();
Console.WriteLine(currentUser.DisplayName);
}
}
}
当然,这个问题是在 UserData() 方法中,graphClient
从未定义过,因为它在 Auth() 方法中。
你可以这样做...
namespace SharpZure
{
class SharpZure
{
static void Main(string[] args)
{
var graphClient = await Auth();
UserData(graphClient);
Console.ReadKey();
}
static async Task<GraphServiceClient> Auth()
{
var clientApp = PublicClientApplicationBuilder.Create(ConfigurationManager.AppSettings["clientId"]).Build();
string[] scopes = new string[] { "user.read" };
string token = null;
var app = PublicClientApplicationBuilder.Create(ConfigurationManager.AppSettings["clientId"]).Build();
var accounts = await app.GetAccountsAsync();
AuthenticationResult result = await app.AcquireTokenInteractive(scopes)
.ExecuteAsync();
token = result.AccessToken;
GraphServiceClient graphClient = new GraphServiceClient(
"https://graph.microsoft.com/v1.0",
new DelegateAuthenticationProvider(
async (requestMessage) =>
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);
}));
return graphClient;
}
static async Task UserData(GraphServiceClient graphClient)
{
Console.WriteLine("Display user details");
var currentUser = await graphClient.Me.Request().GetAsync();
Console.WriteLine(currentUser.DisplayName);
}
}
}
只需 return 来自 Auth() 的 Graph Client 并将其传递给 UserData()。
我有两种方法,第一种获取访问令牌以访问 AzureAD,第二种应该获取用户数据。当代码都在同一个方法中时,我能够让它工作,但我想最终添加命令行参数来调用不同的方法,所以我试图将授权部分分开并在另一个时调用方法被调用。这是我目前所拥有的。
using Microsoft.Identity.Client;
using System;
using System.Threading.Tasks;
using System.Configuration;
using System.Net.Http.Headers;
using PublicClientApplication = Microsoft.Identity.Client.PublicClientApplication;
namespace SharpZure
{
class SharpZure
{
static void Main(string[] args)
{
Auth().GetAwaiter().GetResult();
Console.ReadKey();
}
static async Task Auth()
{
var clientApp = PublicClientApplicationBuilder.Create(ConfigurationManager.AppSettings["clientId"]).Build();
string[] scopes = new string[] { "user.read" };
string token = null;
var app = PublicClientApplicationBuilder.Create(ConfigurationManager.AppSettings["clientId"]).Build();
var accounts = await app.GetAccountsAsync();
AuthenticationResult result = await app.AcquireTokenInteractive(scopes)
.ExecuteAsync();
token = result.AccessToken;
GraphServiceClient graphClient = new GraphServiceClient(
"https://graph.microsoft.com/v1.0",
new DelegateAuthenticationProvider(
async (requestMessage) =>
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);
}));
}
static async Task UserData()
{
Console.WriteLine("Display user details");
var currentUser = await graphClient.Me.Request().GetAsync();
Console.WriteLine(currentUser.DisplayName);
}
}
}
当然,这个问题是在 UserData() 方法中,graphClient
从未定义过,因为它在 Auth() 方法中。
你可以这样做...
namespace SharpZure
{
class SharpZure
{
static void Main(string[] args)
{
var graphClient = await Auth();
UserData(graphClient);
Console.ReadKey();
}
static async Task<GraphServiceClient> Auth()
{
var clientApp = PublicClientApplicationBuilder.Create(ConfigurationManager.AppSettings["clientId"]).Build();
string[] scopes = new string[] { "user.read" };
string token = null;
var app = PublicClientApplicationBuilder.Create(ConfigurationManager.AppSettings["clientId"]).Build();
var accounts = await app.GetAccountsAsync();
AuthenticationResult result = await app.AcquireTokenInteractive(scopes)
.ExecuteAsync();
token = result.AccessToken;
GraphServiceClient graphClient = new GraphServiceClient(
"https://graph.microsoft.com/v1.0",
new DelegateAuthenticationProvider(
async (requestMessage) =>
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);
}));
return graphClient;
}
static async Task UserData(GraphServiceClient graphClient)
{
Console.WriteLine("Display user details");
var currentUser = await graphClient.Me.Request().GetAsync();
Console.WriteLine(currentUser.DisplayName);
}
}
}
只需 return 来自 Auth() 的 Graph Client 并将其传递给 UserData()。