你如何使用Identity Impersonation运行EF 6? (得到错误)

时间:2018-02-13 21:10:27

标签: entity-framework

因此,我们正在尝试创建一个简单的控制台应用程序,但控制台应用程序需要使用Windows集成模式运行它与SQL服务器的连接。我说的很简单,我只是冒充一个服务帐户并以这种方式连接到SQL服务器。不幸的是,它归结为无法找到EF程序集,即使它正好在正在运行的可执行文件旁边。如果我使用相同的代码并将其放在我的using语句之外进行模拟,则代码可以正常工作。 (我有权使用SQL表,但我们的最终用户不会这样做。)

模仿似乎正在起作用,我可以获取模拟信息并将其显示在控制台上,但在处理EF 6.0时却没有。

有人有任何想法吗?

谢谢, 尼克

更新了代码:当然,这是概念证明,相关部分已经更改。

  private static void VILoggingInfo()
  {
     AppDomain myDomain = Thread.GetDomain();
     myDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
     WindowsPrincipal myPrincipal = (WindowsPrincipal) Thread.CurrentPrincipal;
     // who am I right now?
     Console.WriteLine(myPrincipal.Identity.Name);
     string userName = "theUserName", domainName = "theDomain";
     const int LOGON32_PROVIDER_DEFAULT = 0;
     const int LOGON32_LOGON_INTERACTIVE = 2;
     SafeAccessTokenHandle safeAccessTokenHandle;

     bool returnValue = LogonUser(userName,
        domainName,
        "thePassword",
        LOGON32_LOGON_INTERACTIVE,
        LOGON32_PROVIDER_DEFAULT,
        out safeAccessTokenHandle);

     if (returnValue == false)
     {
        int ret = Marshal.GetLastWin32Error();
        Console.WriteLine("LogonUser failed with error code: {0}", ret);
        throw new System.ComponentModel.Win32Exception(ret);
     }

     WindowsIdentity.RunImpersonated(safeAccessTokenHandle,
        () =>
        {
           using (var db = new VIDataModel())
           {
              var newRecord = new VIExecution
              {
                 LoginName = myPrincipal.Identity.Name,
                 ExecutionDate = DateTime.Now
              };
              db.VIExecutions.Add(newRecord);
              db.SaveChanges();
           }

        }
     );
  }

0 个答案:

没有答案