在Unity3D中使用MSAL.NET库时不显示窗口提示

在Unity3D中使用MSAL.NET库时不显示窗口提示,unity3d,sharepoint-online,msal,Unity3d,Sharepoint Online,Msal,我正在尝试通过MSAL库(Microsoft Identity Platform)使用我的Unity应用程序登录SharePoint。当我第一次运行它时,我根本看不到弹出窗口,也没有错误。(注意,我在编辑器中尝试过,并作为独立的exe) 但是,我确实注意到,在第二次运行之后,我得到一个名为Oops的弹出窗口,其中包含消息无法注册窗口类win32错误0。在谷歌搜索之后,我想这可能是因为在第一次尝试之后,背景中的某个地方有一个悬空的窗口,我需要以某种方式清理。如果我重新启动Unity,我可以再次运行

我正在尝试通过MSAL库(Microsoft Identity Platform)使用我的Unity应用程序登录SharePoint。当我第一次运行它时,我根本看不到弹出窗口,也没有错误。(注意,我在编辑器中尝试过,并作为独立的exe)

但是,我确实注意到,在第二次运行之后,我得到一个名为
Oops
的弹出窗口,其中包含消息
无法注册窗口类win32错误0
。在谷歌搜索之后,我想这可能是因为在第一次尝试之后,背景中的某个地方有一个悬空的窗口,我需要以某种方式清理。如果我重新启动Unity,我可以再次运行,第一次没有错误,但再次没有弹出窗口。当然,如果我再次运行,我会再次收到
Oops
消息

可能不相关,但值得注意的是,如果我在
Oops
窗口中点击“Ok”,我会得到一个空异常错误。AcquireTokenInteractive似乎试图打开一个失败的窗口,将其保留为空,然后尝试从空窗口获取令牌

如果您有任何建议可以帮助您找出窗口不显示的原因,我们将不胜感激

使用Microsoft.Identity.Client;
公共类MyApp:MonoBehavior
{
私有字符串ClientId=“i-am-not-telling”;
私有字符串Tenant=“common”;
void Start()
{
SharepointLogin();
}
公共异步void SharepointLogin()
{
PublicClientApp=PublicClientApplicationBuilder.Create(ClientId)
.WithRedirectUri(“https://login.microsoftonline.com/common/oauth2/nativeclient")
.WithAuthority(AzureCloudInstance.AzurePublic,租户)
.Build();
IEnumerable scopes=新列表{“User.Read”};
验证结果;
结果=等待PublicClientApp.AcquireTokenInteractive(作用域)
.ExecuteAsync();
}
}

您是否尝试将父窗口提供给构建器?在Unity中,获取窗口句柄有点困难,但是这段代码可能会起作用,并且可能会解决这个问题

[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();
}
public异步void SharepointLogin()
{
PublicClientApp=PublicClientApplicationBuilder.Create(ClientId)
.WithRedirectUri(“https://login.microsoftonline.com/common/oauth2/nativeclient")
.WithAuthority(AzureCloudInstance.AzurePublic,租户)
.WithParentActivityOrWindow(GetWindowHandle)
.Build();
IEnumerable scopes=新列表{“User.Read”};
验证结果;
结果=等待PublicClientApp.AcquireTokenInteractive(作用域)
.ExecuteAsync();
}

我认为这是Unity或MSAL库之间的错误。我将提交错误报告,并等待修复。这种方法目前根本不起作用。我将不得不使用不同的方法进行身份验证

从Unity更新: 问题源于我们在Unity中不支持的System.Windows.Forms。在可预见的未来,这种行为似乎不会改变。在论坛上,我读到向Plugins文件夹添加System.Windows.Forms.dll有助于一些用户,但MSAL似乎不是这样。即使成功了,我们也不会对任何崩溃或错误负责

我的更新:
我完全取消了这个方法,并按照代码进行了操作。到目前为止,它只在“on-prem”SharePoint网站上成功,我正试图获得支持,以使用“SharePoint Online”服务器。如果您没有我可能面临的相同代理问题,则可能对其他人有效。

我发现需要确保在后台线程中调用交互式浏览器调用。然后它像预期的那样工作


我也对这个问题的答案感兴趣,因为我想做一个项目。我在一个示例项目中设法创建了相同的问题,但找不到解决方案,因此我添加了一个悬赏。我从同一个dll中执行了“FindWindow”以获取IntPtr,并将其传递给您,正如您所示。我可以试试“GetActiveWindow()”,看看这是否有什么不同。谁知道呢,也许它会返回一些不同的东西??还是什么都没有-)谢谢!
Task.Factory.StartNew(() =>await app.AcquireTokenInteractive(STORAGE_SCOPES).ExecuteAsync());