2013-12-05 5 views
1

Я ищу построить доказательство концепции/демо-страницы, которая будет:Запрос учетных данных на странице ASP.NET/C#, перейти к PowerShell

  • работает как сервис (без аутентификации требуется изначально)
  • Запросить учетные данные (то есть разрешить предоставление альтернативных учетных данных, в идеале захватить это как System.Management.Automation.PSCredential). Здесь не требуется аутентификация, мне просто нужно получить учетные данные.
  • Pass полномочия в к PowerShell (например shell.Commands.AddArgument (pscred))
  • Используйте эти учетные данные в PowerShell (передать в качестве, или преобразовать в System.Management.Automation.PSCredential)
  • Для уточнения: I не хотите аутентифицировать учетные данные. Я просто хочу собрать их безопасным способом. Мне все равно на данный момент, это бред, но бред, что я предположительно хочу защитить

У меня есть веб-проект приложения ASP.NET с Visual C# (по аналогии с одним here). У меня запущена и запущена страница (т. Е. Она работает с соответствующей учетной записью, она запускает 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 \r\n for line breaks 
          builder.Append(psObject.BaseObject.ToString() + "\r\n"); 
         } 
    
         // 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 \r\n for line breaks 
          builder.Append(psError.Exception.ToString() + "\r\n"); 
         } 
         // Encode the string in HTML (prevent security issue with 'dangerous' caracters like < > 
         ErrorBox.Text = Server.HtmlEncode(builder.ToString()); 
        } 
    
    } 
    
  • This code не будет работать из-за того, что я понимаю, bu Это концепция именно то, что я ищу.

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

Похоже, что некоторые люди интерпретировали ваш вопрос с вопросом о стиле «рекомендации» (просьба о библиотеке или что-то в этом роде для решения вашей проблемы). Я не уверен, что это то, что вы делали, но я думаю, что вы могли бы подойти к вопросу лучше (чтобы сделать его «по-теме» для переполнения стека). Я думаю, что этот вопрос заслуживает повторного открытия, если вы разместите какой-то код с вашей попыткой собрать/сохранить/передать информацию, которая вам нужна, а затем описать, где вы застряли. – jadarnel27

ответ

2

Я думаю, что самый простой способ заключается в использовании олицетворения. т. е. вы получаете учетные данные пользователя и запускаете процесс powershell в качестве этого пользователя, который позволяет выполнять все, что вы хотите, в качестве этого пользователя.

См:

Execute PowerShell cmdlets from ASP.NET With User Impersonation - Есть шаги, чтобы олицетворять текущего пользователя, чтобы запустить PowerShell

или

How to run PowerShell scripts from ASP.NET with Impersonation - StackOverflow вопрос о том, как запустить PowerShell с олицетворения.

+0

Кажется, я не могу проголосовать за ваш ответ, учитывая мою новую учетную запись! Во всяком случае, да, это мой резервный вариант.В примерах использования, которые я представляю, используется стандартная учетная запись пользователя, запускающая веб-страницу, выбор функции для запуска (например, требующей административных прав) и запрос учетных данных администратора, которые будут переданы скрипту. Это позволит стандартной учетной записи просматривать веб-сайт, а не заставлять пользователей открывать браузер в качестве учетной записи администратора. –

+0

Как насчет того, чтобы проверить эту ссылку: http://stackoverflow.com/questions/9909784/impersonation-a-windows-user таким образом, ваш обычный просмотр находится под одной учетной записью, и вы можете запустить процесс powershell с другой учетной записью. – HAL9256

+0

Спасибо, отлично! В конечном итоге это можно использовать для нескольких сценариев. Если у меня есть внешний интерфейс ASP.NET, я не уверен, как безопасно получать и хранить учетные данные для C#. К сожалению, с веб-сайтом я наименее знаком. –