【发布时间】:2014-01-07 10:08:27
【问题描述】:
我有一个使用 Windows 身份验证 (WA) 的 MVC4 应用程序,它是在 Webconfig 文件中设置的:
<system.web>
<authentication mode="Windows"/>
</system.web>
我正在使用这行代码来获取用户名,而我又在所示的 LINQ 查询中使用它:
var userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
var loc = (from l in data.Locations.OrderBy(l => l.LocationName)
join s in data.LocationSecurities.Where(s=> s.UserName.Contains(userName)) on l.LocationID equals s.LocationId
select new
{
LocationId = l.LocationID,
Name = l.LocationName
}
).ToList().Distinct();
这在调试模式下有效,但是当应用程序发布到 localhost 或 Web 服务器时它不起作用。我看过 SQL Profiler。似乎将用户名作为 DefaultAppPool,并没有带回任何结果!
这是探查器跟踪:
exec sp_executesql N'SELECT
[Extent1].[LocationID] AS [LocationID],
[Extent1].[LocationName] AS [LocationName]
FROM [admin].[Location] AS [Extent1]
INNER JOIN [admin].[LocationSecurity] AS [Extent2] ON [Extent1].[LocationID] = [Extent2].[LocationID]
WHERE [Extent2].[UserName] LIKE @p__linq__0 ESCAPE N''~''',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'%DefaultAppPool%'
知道为什么会这样吗?
提前致谢。
【问题讨论】:
-
发生这种情况是因为在调试模式下,该进程由您的用户身份运行。当您将其发布到 IIS 时,会使用另一个用户身份来运行该进程,因此它不起作用。
-
根据 Dave Bish 在下面的回答,我认为您不需要那么多代码来找到所需的用户。 MVC/System.Web 中有一些“快捷方式”选项
标签: c# asp.net .net asp.net-mvc-4