首次异步查询后丢失我的应用程序池标识

时间:2018-03-28 19:48:47

标签: asp.net sql-server connection-string impersonation

我在IIS 7.5上运行了.NET API。 API在使用Active Directory域帐户的应用程序池中运行,用于对SQL数据库进行身份验证(托管在其他服务器上)。

App Pool身份的凭据适用于我的一些查询,但其他人返回以下错误:

  

底层提供程序在Open上失败。

内部例外是:

  用户' NT AUTHORITY \ ANONYMOUS LOGON&#39>

登录失败。

我似乎失去了我的App Pool身份凭证,但我不明白为什么。

在我的API GET中的调用中可以看到它成功但失败的示例:

   using (FtpJobsContext db = new FtpJobsContext())
        {
            Job job = await db.Jobs.FindAsync(guidJobId);
            if (job != null)
            {
                JobDetailAPIModel result = await GetDetails(db, job, NUMBER_OF_EXECUTIONS);
                return Ok(result);
            }
            else
            {
                return NotFound();
            }
        }

FindAsync的{​​{1}}调用正常。建立连接,并检索适当的作业。

但是,当我将DbContext传递给私有方法时,似乎db连接更改为匿名。

GetDetails的定义类似于:

db.jobs

来自Web.Config的我的连接字符串如下所示:

private async Task<JobDetailAPIModel> GetDetails(FtpJobsContext db, Job job, int executionNumber)
        {
            JobDetailAPIModel result = new JobDetailAPIModel();

            ICollection<JobScheduleAPIModel> schedules = new Collection<JobScheduleAPIModel>();
            foreach (JobSchedule sched in job.JobSchedules)
            {
                schedules.Add(new JobScheduleAPIModel(sched));
            }
            result.JobSchedules = schedules;
            ICollection<SSISPackageSummaryAPIModel> packages = new Collection<SSISPackageSummaryAPIModel>();
            foreach (SSISPackage pack in job.SSISPackages)
            {
                packages.Add(new SSISPackageSummaryAPIModel(pack));
            }
            result.SSISPackages = packages;
            ICollection<ExecutionAPIModel> executions = await (from e in db.View_Executions
                                                  join p in db.SSISPackages on e.SSISPackageId equals p.SSISPackageId
                                                  join j in db.Jobs on p.JobId equals j.JobId
                                                  where p.JobId == job.JobId
                                                  orderby e.StartTime descending
                                                  select new ExecutionAPIModel
                                                  {
                                                      ExecutionId = e.ExecutionId,
                                                      PackageDisplayName = e.PackageDisplayName,
                                                      Status = e.Status,
                                                      StartTime = e.StartTime,
                                                      EndTime = e.EndTime,
                                                      Duration = e.Duration
                                                  }).Take(executionNumber).ToListAsync();
            result.LatestExecutions = executions;
            return result;
        }

1 个答案:

答案 0 :(得分:0)

我在撰写问题时找到了答案,但无论如何我想分享它,以防其他人遇到类似的问题。

问题是我的连接字符串。 Pooling=False迫使Using语句中的后续连接丢失凭据并恢复为匿名。

将连接字符串更改为Pooling=True可解决问题。