我正在尝试通过MSAL库(Microsoft Identity Platform)使用Unity应用程序登录到SharePoint。第一次运行时,我完全看不到弹出窗口,也没有错误。 (请注意,我已经在Editor中作为独立的exe进行过尝试)
但是,我在第二次运行后确实注意到了,我看到一个弹出窗口,标题为Oops
,消息为Could not register the window class win32 error 0
。经过一番谷歌搜索后,我认为可能是因为第一次尝试后,我需要以某种方式清理后,背景中某处有一个悬空窗口。如果重新启动Unity,我可以再次运行,并且第一次没有错误,但是没有弹出窗口。当然,如果第二次运行,我会再次收到Oops
消息。
可能不相关,但值得注意的是,如果我在Oops
窗口中单击“确定”,则会出现空异常错误。看来AcquireTokenInteractive试图打开一个失败的窗口,将其保留为空,然后尝试从空中获取令牌。
非常感谢您提供任何有助于弄清楚为什么窗口不显示的建议
using Microsoft.Identity.Client;
public class MyApp: MonoBehaviour
{
private string ClientId = "i-am-not-telling";
private string Tenant = "common";
void Start()
{
SharepointLogin();
}
public async void SharepointLogin()
{
PublicClientApp = PublicClientApplicationBuilder.Create(ClientId)
.WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
.WithAuthority(AzureCloudInstance.AzurePublic, Tenant)
.Build();
IEnumerable<string> scopes = new List<string> { "User.Read" };
AuthenticationResult result;
result = await PublicClientApp.AcquireTokenInteractive(scopes)
.ExecuteAsync();
}
}
您是否尝试过将父窗口提供给Builder?在Unity中,获取Window句柄有点困难,但是此代码可能有效并且可能解决了问题。
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern System.IntPtr GetActiveWindow();
public static System.IntPtr GetWindowHandle() {
return GetActiveWindow();
}
然后用WithParentActivityOrWindow
调用它>
public async void SharepointLogin()
{
PublicClientApp = PublicClientApplicationBuilder.Create(ClientId)
.WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
.WithAuthority(AzureCloudInstance.AzurePublic, Tenant)
.WithParentActivityOrWindow(GetWindowHandle)
.Build();
IEnumerable<string> scopes = new List<string> { "User.Read" };
AuthenticationResult result;
result = await PublicClientApp.AcquireTokenInteractive(scopes)
.ExecuteAsync();
}
我相信这是Unity或MSAL库之间的错误。我将向两者提交错误报告并等待修复。此方法暂时无法使用。我将不得不使用其他方法进行身份验证。