如何通过交互提供凭据从asp.net Web窗体应用程序连接到Azure Active Directory?

问题描述

我想为任何用户提供通过我的网站连接到Powershell Azure Active Directory模块并在其Microsoft租户中执行一些管理操作的能力。我正在使用的代码是:

InitialSessionState iss = InitialSessionState.CreateDefault2();

iss.ImportPSModule(new[] { "MSOnline" });

var shell = PowerShell.Create(iss);

var connectCmd = new Command("Connect-MsolService");

shell.Commands.AddCommand(connectCmd);

var results = shell.Invoke();

但在Invoke之后出现以下错误

当应用程序不在UserInteractive模式下运行时,显示模式对话框或表单是无效操作。指定ServiceNotification或DefaultDesktopOnly样式以显示来自服务应用程序的通知

当我在PowerShell ISE中以以下方式运行PowerShell代码时,情况并非如此:

Import-Module MSOnline

Connect-MsolService

相反,我在登录对话框中可以提供登录凭据。

我希望网站用户获得与他们相同的登录对话框。

在C#代码中,我不想将凭据作为参数传递给Connect-MsolService cmdlet,而是从用户以交互方式收集它,以便它也与启用了MFA的帐户一起使用。

注意:用户将与部署在Web服务器上的网站进行交互,并且永远不会直接登录服务器。嵌入在C#中的Powershell代码也将在Web服务器上运行。

到目前为止,我的互联网搜索无济于事。有没有办法让这个工作?请分享任何提示,想法和解决方案。

解决方法

您的代码正在Web服务器(作为Web应用程序)上运行,而不是在使用它的客户端上运行-将尝试在服务器上打开弹出窗口-因此出现错误!

自从您提到您将无法通过凭据。

您可以使用访问令牌进行身份验证的另一个选项。

memset

您正在使用C#,因此可以利用MSAL(Microsoft身份验证库)执行交互式登录并获取令牌。您可以参考unless the compiler optimizes malloc + memset(...,...) to calloc了解更多信息。

获取的令牌可以随后传递到powershell Commandlet以执行必要的操作。