Asp.net 不使用asp成员身份的active directory基于表单身份验证

Asp.net 不使用asp成员身份的active directory基于表单身份验证,asp.net,iis,active-directory,forms-authentication,integrated-pipeline-mode,Asp.net,Iis,Active Directory,Forms Authentication,Integrated Pipeline Mode,我试图让用户输入他们的域登录详细信息,这样网站就可以获得一个组列表,以确定连接到哪个数据库 我找到的最近的代码来自microsoft: 当我使用IIS8,ASP 4.5时,代码在web.config中失败,参考 <identity impersonate="true" /> HTTP Error 500.24 - Internal Server Error An ASP.NET setting has been detected that does not app

我试图让用户输入他们的域登录详细信息,这样网站就可以获得一个组列表,以确定连接到哪个数据库

我找到的最近的代码来自microsoft:

当我使用IIS8,ASP 4.5时,代码在web.config中失败,参考

       <identity impersonate="true" />


HTTP Error 500.24 - Internal Server Error

An ASP.NET setting has been detected that does not apply in 
Integrated managed pipeline mode.
好的,所以我删除了这个条目,并对我的域进行了身份验证,但是当它重定向出现的同一个登录页面时,我假设没有任何东西告诉它模拟

进一步挖掘似乎无法使用此代码,因为它不支持托管管道模式。我不想将asp成员身份用作使用域组来验证权限

救命啊


要保留集成的托管管道,我正在使用ASP.Net模拟,以便可以使用经过身份验证的ad用户对sql数据库进行身份验证。

在IIS中,托管管道模式是针对每个应用程序池设置的。默认情况下,它设置为集成模式

您可以将其更改为经典模式。使用“编辑应用程序池”对话框设置模式,当您在IIS管理器中右键单击应用程序池并选择“基本设置”时,将打开该对话框:


如果您需要了解站点正在使用哪个应用程序池,请查看站点的高级设置。

在集成模式下不允许模拟的原因是它与异步操作冲突,因为操作可以作为一个用户开始,作为另一个用户结束。。。这让人很困惑

一种方法是使用WindowsImpersonationContext。假设您正在使用Windows身份验证:

WindowsIdentity id = (WindowsIdentity)Context.User.Identity;

// impersonation is automatically undone by
// WindowsImpersonationContext.Dispose()
using (WindowsImpersonationContext wic = id.Impersonate())
{
    // log into your database, do your queries, then cleanup
}
这里的缺点是,您不能在响应生命周期内或更长时间内保持连接打开。。这可能是件好事。。在退出using语句之前,需要清理数据库代码


注意:工作进程必须具有模拟其他用户的权限,否则将无法工作。

很抱歉,我应该说我需要集成模式。为新应用程序推荐经典模式不是一个好选择,因为经典模式可能会在未来的IIS版本中消失。最好在集成模式下开发新的应用程序。我不太清楚你想要实现什么。模拟通常仅在需要以用户凭据的身份运行IIS工作进程时使用。例如,如果要以该用户的身份访问网络资源。除非绝对必要,否则一般不推荐。你能解释一下你的要求吗。。。获取组列表以确定要连接到的数据库非常模糊。@nickan您不能使用Windows身份验证而不是表单身份验证吗?然后使用System.DirectoryServices进行查找我一直在使用windows身份验证,因为这是一个intranet应用程序,但我需要在internet上提供此功能,因此请查看表单身份验证以获取windows用户。