本文介绍了如何在最新的Microsoft.IdentityModel.Clients.ActiveDirectory中使用PromptBehavior来获取令牌的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在较早版本的Microsoft.IdentityModel.Clients.ActiveDirectory中,带有带有PromptBehavior参数的AcquireToken

In the older versions of Microsoft.IdentityModel.Clients.ActiveDirectory there is AcquireToken with PromptBehavior parameter

var context = new AuthenticationContext("https://login.windows.net/tenantId");
var result = context.AcquireToken(clientId: clientIdValue, redirectUri: new Uri("http://localhost/Appcycle"), resource: "https://management.core.windows.net/", promptBehavior: PromptBehavior.Auto);

在Microsoft.IdentityModel.Clients.ActiveDirectory v3.10中,只有AcquireTokenAsync

In Microsoft.IdentityModel.Clients.ActiveDirectory v3.10 there is only AcquireTokenAsync

var authParam = new PlatformParameters(PromptBehavior.Auto,false);
var result = context.AcquireTokenAsync("https://management.core.windows.net/", clientid, new Uri("http://localhost/AppPoolRecycle"), authParam);
result.Wait();

运行此命令时出现错误 {无效的所有者窗口类型.期望的类型为IWin32Window或IntPtr(用于窗口句柄)."}

When I run this I get error{"Invalid owner window type. Expected types are IWin32Window or IntPtr (for window handle)."}

不确定这是否是由于我正在控制台应用程序上运行.如果是这样,我如何使它工作?

Not sure if this is due to I am running on a console application. If so how do i get it to work?

推荐答案

出现此错误的原因是因为您要在PlatformParameters构造函数中为第二个参数传递"false".

The reason you're getting this error is because you are passing in "false" for the second parameter in the PlatformParameters constructor.

在最新版本的ADAL(Microsoft.IdentityModel.Clients.ActiveDirectory v3.10)中,第二个参数是(来自 https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/blob/7c9091a6495e40fe/ADAL.PCL.Desktop/PlatformParameters.cs ):

In the latest version of ADAL (Microsoft.IdentityModel.Clients.ActiveDirectory v3.10), this second parameter is (from https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/blob/7c9091a0edecf401fea402275e4a64aca95e40fe/src/ADAL.PCL.Desktop/PlatformParameters.cs):

    /// <summary>
    /// Gets the owner of the browser dialog which pops up for receiving user credentials. It can be null.
    /// </summary>
    public object OwnerWindow { get; private set; }

您传入的是false,因为它是对象,因此在编译时会接受,但鉴于它不是窗口,则在运行时不会接受.

You're passing in false, which is accepted at compile time given that it's an object, but not at runtime given that it's not a window.

要解决此问题,请勿传入此参数或将其作为null传入.这将使您的控制台应用程序启动一个窗口,提示用户登录.

To fix this simply do not pass in this parameter or pass it in as null. This will make your console application launch a window which prompts the user to log in.

如果这是一个应该在没有任何用户交互的情况下运行 的控制台应用程序,则您应该通过AcquireTokenAsync的此其他重载使用仅应用程序流:

If this is meant to be a console application that's supposed to run without any user interaction though, then you should either use the app-only flow via this other overload of AcquireTokenAsync:

    /// <summary>
    /// Acquires security token from the authority.
    /// </summary>
    /// <param name="resource">Identifier of the target resource that is the recipient of the requested token.</param>
    /// <param name="clientCredential">The client credential to use for token acquisition.</param>
    /// <returns>It contains Access Token and the Access Token's expiration time. Refresh Token property will be null for this overload.</returns>        
    public async Task<AuthenticationResult> AcquireTokenAsync(string resource, ClientCredential clientCredential)

这篇关于如何在最新的Microsoft.IdentityModel.Clients.ActiveDirectory中使用PromptBehavior来获取令牌的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-25 01:20