如何从ASP.NET应用程序获取登录的Windows域帐户?

时间:2020-03-05 18:50:43  来源:igfitidea点击:

我们有一个ASP.NET应用程序来管理它自己的用户,角色和权限数据库,并且我们最近在User表中添加了一个字段来保存Windows域帐户。

我要这样做,以便用户不必实际登录到我们的应用程序,而是根据当前登录的Windows域帐户DOMAIN \ username自动登录。我们想根据我们自己的用户表对Windows域帐户进行身份验证。

这是在Windows窗体中要做的事,是否有可能在Web窗体中做到这一点?

我不希望Windows质询屏幕提示用户,我希望我们的系统处理登录。

澄清:我们正在使用我们自己的自定义Principal对象。

说明:不确定是否有所不同,但我们使用的是IIS7.

解决方案

回答

using System.Security.Principal;
...
WindowsPrincipal wp = (WindowsPrincipal)HttpContext.Current.User;

获取当前域用户。当然,我们必须确保将IIS设置为处理Windows身份验证。

回答

这可能会有所帮助:

WindowsIdentity myIdentity = WindowsIdentity.GetCurrent();

WindowsPrincipal myPrincipal = new WindowsPrincipal(myIdentity);

string name = myPrincipal.Identity.Name;
string authType = myPrincipal.Identity.AuthenticationType;
string isAuth = myPrincipal.Identity.IsAuthenticated.ToString();

string identName = myIdentity.Name;
string identType = myIdentity.AuthenticationType;
string identIsAuth = myIdentity.IsAuthenticated.ToString();
string iSAnon = myIdentity.IsAnonymous.ToString();
string isG = myIdentity.IsGuest.ToString();
string isSys = myIdentity.IsSystem.ToString();
string token = myIdentity.Token.ToString();

免责声明:我是从Technet文章中获得此信息的,但找不到链接。

回答

几年前,我几乎完全按照意愿去做。我试图为它找到一些代码,尽管它是以前的工作,所以代码就在家里。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

我确实记得,尽管我以本文为起点。我们设置了LDAP提供程序,以便实际上可以对用户和LDAP进行检查。确保尝试使用LDAP方法的一件事。在设置LDAP的设置文件中,请确保LDAP全部为大写,否则请解决。

回答

我们可以使用" System.Threading.Thread.CurrentPrincipal"。

回答

Request.ServerVariables [" REMOTE_USER"]

对于设置,这尚未得到验证,但是我记得不久前使用过它。

回答

这类集成是在服务器级别进行的,由IIS来确定用户未登录。 IIS将身份验证提示发送回用户,浏览器对此做出反应。

当我们要使用域登录时,只有一种方法可以执行此操作。集成的Windows身份验证。仅当IIS服务器也是域的一部分并且用户直接(而不是通过代理)从也是域的机器(用户已正确登录)访问计算机时,这才起作用。

但是,自定义主体对象可能会创造乐趣和游戏;这种类型的身份验证将是WindowsPrincipal和WindowsIdentity;我们可以通过User对象访问它(请参阅如何:在ASP.NET 2.0中使用Windows身份验证)

我假设由于自定义角色而需要自定义主体吗?我怀疑我们能否使两者完美地结合在一起?我们可以创建一个自定义角色提供程序来查看数据存储,也可以查看ADAM,它是AD的扩展,它按程序提供角色,并提供了不错的管理工具。

回答

尝试使用Request.ServerVariables(" LOGON_USER")。

如果设置了目录安全性选项,以使该目录不允许匿名用户,则当冲浪者点击此页面时,将通过标准模态对话框提示要求用户名和密码。 Request.ServerVariables(" LOGON_USER")将返回该用户。

但是,这可能对我们不起作用,因为我们正在使用自己的自定义安全对象。如果我们能弄清楚如何解决该登录框,或者在NT凭据要求它们之前将NT凭据传递给该站点,那么我们将大功告成。

回答

我们考虑过假冒吗?我们可以将用户的NT登录凭据存储在自定义安全对象中,然后在适当的时候通过代码对用户进行认证。

http://msdn.microsoft.com/zh-CN/library/aa292118(VS.71).aspx