在ASP.NET/C#页中提示输入凭据,然后传递给PowerShell



我想建立一个概念验证/演示网页,它将:

  • 作为服务运行(最初不需要身份验证)
  • 提示凭据(即,为了允许提供备用凭据,最好将其捕获为System.Management.Automation.PSCredential)。这里不需要身份验证,我只需要捕获凭据
  • 将凭据传入PowerShell(例如,shell.Commands.AddArgument(pscred))
  • 在PowerShell中使用这些凭据(作为传入,或转换为System.Management.Automation.PSCredential)
  • 澄清一下:我不想验证凭据。我只想以一种安全的方式收集它们。就我目前所关心的而言,这是胡言乱语,但我大概想保护它

我有一个使用Visual C#的ASP.NET Web应用程序项目(类似于这里的项目)。我已经启动并运行了该页面(即,它使用适当的帐户运行,运行PowerShell等)-我想以合理安全的方式提示和存储凭据。我想有一些标准的方法可以做到这一点。还是因为这是一个服务器端应用程序,所以我对此读得太多了?

以下是迄今为止我的代码摘录:

  • Default.aspx(这些将根据情况进行更改):

    <asp:TextBox ID="Input" runat="server" TextMode="MultiLine" Width="400px" Height="73px" ></asp:TextBox>  
    <asp:TextBox ID="InputParam" runat="server" TextMode="MultiLine" Width="200px" Height="20px" ></asp:TextBox>  
    <asp:Button ID="ExecuteCode" runat="server" Text="Execute" Width="200" onclick="ExecuteCode_Click" />
    <asp:TextBox ID="ResultBox" TextMode="MultiLine" Width="700" Height="200" runat="server"></asp:TextBox>
    <asp:TextBox ID="ErrorBox" TextMode="MultiLine" Width="700" Height="200" runat="server"></asp:TextBox>
    
  • Default.aspx。cs:

    protected void ExecuteCode_Click(object sender, EventArgs e)
    {
        // Clean the Result TextBox
        ResultBox.Text = string.Empty;
        // Initialize PowerShell engine
        var shell = PowerShell.Create();
        // Add the script and an argument to the PowerShell object
        shell.Commands.AddScript(Input.Text);
        shell.Commands.AddArgument(InputParam.Text);
        // Execute the script
        var results = shell.Invoke();
        // display results, with BaseObject converted to string
        // Note : use | out-string for console-like output
        if (results.Count > 0)
        {
            // We use a string builder ton create our result text
            var builder = new StringBuilder();
            foreach (var psObject in results)
            {
                // Convert the Base Object to a string and append it to the string builder.
                // Add rn for line breaks
                builder.Append(psObject.BaseObject.ToString() + "rn");
            }
            // Encode the string in HTML (prevent security issue with 'dangerous' caracters like < >
            ResultBox.Text = Server.HtmlEncode(builder.ToString());
        }
        //Collect errors
        var PSErrors = shell.Streams.Error.ReadAll();
        if (PSErrors != null)
        {
            // We use a string builder ton create our error text
            var builder = new StringBuilder();
            foreach (var psError in PSErrors)
            {
                // Convert the exception Object to a string and append it to the string builder.
                // Add rn for line breaks
                builder.Append(psError.Exception.ToString() + "rn");
            }
            // Encode the string in HTML (prevent security issue with 'dangerous' caracters like < >
            ErrorBox.Text = Server.HtmlEncode(builder.ToString());
        }
    }
    
  • 根据我的理解,这个代码不起作用,但这个概念正是我想要做的

    PSCredential pscred = this.Host.UI.PromptForCredential("Enter username/password","", "", "");
    shell.Commands.AddArgument(pscred);
    

我认为最简单的方法是使用模拟。即,您获得用户的凭据,并以该用户身份启动powershell进程,从而允许您以该用户的身份执行任何您想要的操作。

参见:

使用用户模拟从ASP.NET执行PowerShell cmdlet-具有模拟当前用户以运行PowerShell 的步骤

如何使用模拟从ASP.NET运行PowerShell脚本-关于如何使用模拟运行PowerShell的StackOverflow问题。

相关内容

  • 没有找到相关文章

最新更新