当前位置: 首页 > 知识库问答 >
问题:

如何使用图形API在Windows窗体应用程序中显示日志用户名?

陆子石
2023-03-14

我正在使用图形API创建一个Windows窗体应用程序。在应用上,我有更多的形式。另外,我有一个用于登录用户的函数,当用户登录时,他的名字会写在第一个表单上的标签上。在其他表单上,我有一个取消按钮,所以当用户单击取消按钮时,第一个表单会出现,但用户名不会写在标签上。代码如下:

public static class GraphHelper
{
    private static string[] scopes = new string[] { "user.read" };
    public static string TokenForUser = null;
    public static DateTimeOffset expiration;

    private const string ClientId = "599ed98d-4356-4a96-ad37-04391e9c48dc";

    private const string Tenant = "common"; 
    private const string Authority = "https://login.microsoftonline.com/" + Tenant;

    // The MSAL Public client app
    private static IPublicClientApplication PublicClientApp;

    private static string MSGraphURL = "https://graph.microsoft.com/beta/";
    private static AuthenticationResult authResult;

    public static GraphServiceClient graphClient;
    public static string token;

    public static GraphServiceClient GetGraphClient(string token)
    {
        if (graphClient == null)
        {
            // Create Microsoft Graph client.
            try
            {
                graphClient = new GraphServiceClient(
                    "https://graph.microsoft.com/beta",
                    new DelegateAuthenticationProvider(
                        async (requestMessage) =>
                        {
                            requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);
                            // This header has been added to identify our sample in the Microsoft Graph service.  If extracting this code for your project please remove.
                            requestMessage.Headers.Add("SampleID", "uwp-csharp-snippets-sample");

                        }));
                return graphClient;
            }

            catch (Exception ex)
            {
                Debug.WriteLine("Could not create a graph client: " + ex.Message);
            }
        }
        return graphClient;
    }

    public static async Task<string> GetTokenForUserAsync()
    {
        if (TokenForUser == null || expiration <= DateTimeOffset.UtcNow.AddMinutes(10))
        {
            PublicClientApp = PublicClientApplicationBuilder.Create(ClientId)
          .WithAuthority(Authority)
          .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
           .WithLogging((level, message, containsPii) =>
           {
               Debug.WriteLine($"MSAL: {level} {message} ");
           }, LogLevel.Warning, enablePiiLogging: false, enableDefaultPlatformLogging: true)
          .Build();

            // It's good practice to not do work on the UI thread, so use ConfigureAwait(false) whenever possible.
            IEnumerable<IAccount> accounts = await PublicClientApp.GetAccountsAsync().ConfigureAwait(false);
            IAccount firstAccount = accounts.FirstOrDefault();

            try
            {
                authResult = await PublicClientApp.AcquireTokenSilent(scopes, firstAccount)
                                                  .ExecuteAsync();
            }
            catch (MsalUiRequiredException ex)
            {
                // A MsalUiRequiredException happened on AcquireTokenSilentAsync. This indicates you need to call AcquireTokenAsync to acquire a token
                Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");

                authResult = await PublicClientApp.AcquireTokenInteractive(scopes)
                                                  .ExecuteAsync()
                                                  .ConfigureAwait(false);
            }

            TokenForUser = authResult.AccessToken;
        }

        return TokenForUser;
    }

    public static async Task<User> GetMeAsync(string token)
    {
        graphClient = GetGraphClient(token);
        try
        {
            // GET /me
            return await graphClient.Me
                .Request()
                .Select(u => new
                {
                    u.DisplayName
                })
                .GetAsync();
        }
        catch (ServiceException ex)
        {
            return null;
        }
    }
}

  public partial class Form1 : Form
{
    public static string token;
    public static GraphServiceClient graphClient;

    public Form1()
    {
        InitializeComponent();
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        token = await GraphHelper.GetTokenForUserAsync();
        User graphUser = await GraphHelper.GetMeAsync(token);
        label4.Text = graphUser.DisplayName;
    }
}

public partial class Form2 : Form
{

    public Form2()
    {
        InitializeComponent();
    }
private void button2_Click(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        this.Close();
        f1.Show();
    }
}

有没有人知道当用户单击“取消”按钮时,如何在第一个表单上显示用户名?

共有1个答案

尚棋
2023-03-14

form1中创建一个公共方法,该方法将调用Graph API并显示用户名。

Form1.Button1_ClickForm2.Button2_Click调用此方法

public partial class Form1 : Form
{
    public static string token;
    public static GraphServiceClient graphClient;

    public Form1()
    {
        InitializeComponent();
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        await ShowUserAsync();
    }

    public async Task ShowUserAsync()
    {
        token = await GraphHelper.GetTokenForUserAsync();
        User graphUser = await GraphHelper.GetMeAsync(token);
        label4.Text = graphUser.DisplayName;
    }
}

public partial class Form2 : Form
{

    public Form2()
    {
        InitializeComponent();
    }
    private async void button2_Click(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        await f1.ShowUserAsync();
        this.Close();
        f1.Show();
    }
}
 类似资料:
  • 问题内容: 我收到应用程序异常 每次当我尝试单击DataGridView时。 我收到错误消息 {“索引-1没有值。”}(SystemIndexOutOfaRange异常)。 在行上 而且我无法调试它。请帮助我找出导致此问题的原因以及如何对其进行调试? 问题答案: 我猜想您已经将一个最初为空的List(或其他不生成列表已更改事件的集合)绑定到了您的,然后将项目添加到了此List中。 您添加的项目将正

  • 问题内容: 我想以特定尺寸在Android应用程序中显示图片。我该怎么做?请指导我?还有一件事,我想从SD卡中获得该图像。所以请帮帮我。 提前致谢。 问题答案: 首先,您需要创建一个imageview。 创建布局参数以在布局上添加imageview 然后获取您的图像路径 在ImageView上设置图像 获取您要添加的布局 将视图添加到布局

  • 我正在设置一个新的web应用程序,通过Application Insights登录。我已经安装了AI,并且看到了所有预期的遥测(服务器请求、失败的请求等),但没有通过ILogger发送日志。我已经看过所有类似的问题,我可以找到这样,但没有解决我的问题。 我正在使用。NET 5和2.17版。Microsoft的0(最新版本)。应用程序指示灯。AspNetCore-nuget包。连接字符串和检测键显示

  • 我使用的是JBOSS-7.0,并且希望基于War文件来分离应用程序日志,即我有war1和war2,因此应该基于war1.log和war2.log这样的独立日志文件来生成。现有的日志记录配置是standalone.xml。我读过Jboss给出的这个链接,但是他们给出的配置是在jboss-log4j.xml文件中,而不是standalone.xml日志模块更改。 有人能建议在JBOSS-7.0中为每个

  • 我发现围绕这个主题有很多问题,但没有一个回答我的问题。我有一个聊天应用程序,要求我在收到消息但尚未看到时更改任务栏中的应用程序图标,并在看到所有消息时再次更改它。 在从VS2013开始运行应用程序时,我成功地做到了这一点,使用显示的表单中的以下代码:

  • 是否有写入此事件日志的方法: 或者至少是其他一些Windows默认日志,在那里我不必注册事件源?