.net олицетворяет не передавать надлежащие учетные данные в SQL Server - PullRequest
0 голосов
/ 17 мая 2018

В настоящее время у меня есть консольное приложение .net, которому необходимо получить активную учетную запись домена через файл appConfig для подключения к базе данных.Приложение выполняется из TaskScheduler.Я не могу использовать учетную запись домена для выполнения задачи, так как это настройка безопасности (сохранение пароля).

У меня есть строка подключения в консолидированном файле настроек (appSettings.config) и я установил удостоверение в консолифайл настроек приложения, включая имя пользователя и пароль

Мой вопрос: как я могу использовать планировщик задач для выполнения задания и иметь имя пользователя / пароль в файлах конфигурации?

В тестировании я использовалучетной записи «Локальная служба» и «Сетевая служба» и получают ошибку входа в систему от SQL Server "

Ошибка входа для пользователя 'DOMAIN_NAME \ MACHINE_NAME $'. Причина: не удалось найти имя входа, соответствующеепредоставленное имя. [КЛИЕНТ: xxx.xxx.xx.xx (ip-адрес клиентского компьютера)]

Если я использую локальную учетную запись с правами администратора, возвращается следующая ошибка:

Ошибка входа в систему. Вход в систему из ненадежного домена и не может использоваться с проверкой подлинности Windows. [КЛИЕНТ: xxx.xxx.xx.xx]

ПРИМЕЧАНИЯ:

все машины находятся в одном домене и имеют подключение

, когда задача настроена для запуска в качестве учетной записи домена, а тег идентификации делаетНЕ ИМЯ пользователя / пароля, задача выполняется, как задумано.

appSettings.config

    <?xml version="1.0"?>
    <appSettings>    
        <!-- CONNECTION STRINGS -->
        <add key="connectionString"                 value="Data Source=DB_SERVER_NAME;Initial Catalog=DB_NAME;Integrated Security=SSPI;" />
.....
.....

application.exe.config

   <?xml version="1.0"?>
    <configuration>
      <configSections>

      </configSections>  
     <appSettings file="F:\SPASystems\Conf\appSettings.config" />
      <system.web>  
      <identity impersonate="true" userName="DOMAIN_NAME\svc.ACCOUNT_NAME.user" password="dummy_password"/>
        <membership defaultProvider="ClientAuthenticationMembershipProvider">
....
....

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Мое окончательное решение было использовать олицетворение и передать делегировать метод для выполнения в олицетворенном контексте.это фрагменты кода, которые я использовал для этого:

internal class NativeMethods
    {
        // closes open handes returned by LogonUser
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public extern static bool CloseHandle(IntPtr handle);

        // obtains user token
        [DllImport("advapi32.dll", SetLastError = true)]
        public static extern bool LogonUser(string pszUsername, string pszDomain, string pszPassword,
            int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
    }

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    public sealed class Impersonation
    {
        /// <summary>
        /// impersonates a user based on username/password provided. executed method after impersonation and then reverts impersonation when task/method is complete.
        /// </summary>
        /// <param name="userName">username to impersonate</param>
        /// <param name="password">password for user account</param>
        /// <param name="domain">domain of user to impersonate</param>
        /// <param name="action">method to invoke after impersonation</param>
        /// <param name="logonType">LogonType to use, defaulted to Network</param>
        /// <param name="logonProvider">LogonProvider type, defaulted to default</param>
        public static void impersonate(string userName, string password, string domain, Action action, int logonType = 2, int logonProvider = 0)
        {
            //elevate privileges before doing file copy to handle domain security
            WindowsImpersonationContext context = null;
            IntPtr userHandle = IntPtr.Zero;
            try
            {
                Console.WriteLine("windows identify before impersonation: " + WindowsIdentity.GetCurrent().Name);
                // Call LogonUser to get a token for the user
                bool loggedOn = NativeMethods.LogonUser(userName,
                                            domain,
                                            password,
                                            logonType,
                                            logonProvider,
                                            ref userHandle);
                if (!loggedOn)
                {
                    Console.WriteLine("Exception impersonating user, error code: " + Marshal.GetLastWin32Error());
                }

                // Begin impersonating the user
                context = WindowsIdentity.Impersonate(userHandle);

                Console.WriteLine("windows identify after impersonation: " + WindowsIdentity.GetCurrent().Name);                
                //execute actions under impersonated user
                action();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception impersonating user: " + ex.Message);
            }
            finally
            {
                // Clean up
                if (context != null)
                {
                    context.Undo();
                }

                if (userHandle != IntPtr.Zero)
                {
                    NativeMethods.CloseHandle(userHandle);
                }
            }
        }

Затем я смог вызвать и использовать контекст олицетворения следующим образом:

Impersonation.impersonate(impersonationUserName, impersonationPassword, impersonationDomain, () => processReport(args));

метод processReport(string[] args)затем выполняется в контексте с использованием информации об учетной записи, предоставленной в домене, имени пользователя и пароля.при необходимости это могут быть и безопасные строки.

0 голосов
/ 17 мая 2018

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

Олицетворение передает идентификацию исходного вызывающего абонента во внутренние ресурсы на том же компьютере.Делегирование передает исходную идентификацию вызывающего абонента на внутренние ресурсы на компьютерах, отличных от компьютера, на котором запущена служба.

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

Следовательно, вам необходимо использовать Делегирование .

Вы также можете найти thisтема полезно.

...