8

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

我想让用户不必 亲自登录我们的应用程序,而是根据当前登录的 Windows 域帐户 DOMAIN\username 自动登录。我们想根据我们自己的用户表对 Windows 域帐户进行身份验证。

这是在 Windows 窗体中做的小菜一碟,是否可以在 Web 窗体中做到这一点?

我不希望用户收到 Windows 挑战屏幕提示,我希望我们的系统处理登录。

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

澄清:不确定它是否有所作为,但我们使用的是 IIS7。

4

8 回答 8

2

这种集成是在服务器级别,是 IIS 决定用户未登录;并且是 IIS 将身份验证提示发送回用户,浏览器对此做出反应。

由于您想使用域登录,因此只有一种方法可以做到这一点;集成 Windows 身份验证。这只有在 IIS 服务器也是域的一部分并且用户直接访问机器而不是通过代理,并且从也是域的一部分的机器(用户适当地登录)时才有效。

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

我假设您因为您的自定义角色而想要一个自定义主体?我怀疑你能否让这两个发挥得很好。您可以创建一个自定义角色提供程序来查看您的数据存储,或者查看您可以查看ADAM,它是 AD 的扩展,它在每个程序的基础上提供角色并带有很好的管理工具。

于 2008-09-20T17:23:45.397 回答
1
using System.Security.Principal;
...
WindowsPrincipal wp = (WindowsPrincipal)HttpContext.Current.User;

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

于 2008-09-10T13:44:28.310 回答
1

这可能会有所帮助:

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();

免责声明:我从一篇技术网文章中得到了这个,但我找不到链接。

于 2008-09-10T13:49:03.683 回答
1

几年前我做了你想做的事情。我试图为它找到一些代码,尽管它是在以前的工作中,所以代码就在家里。

我记得虽然我用这篇文章作为我的起点。您设置了 LDAP 提供程序,以便您可以实际运行用户与 LDAP 的检查。如果您尝试使用 LDAP 方法,请确定一件事。在设置 LDAP 的设置文件中,确保 LDAP 全部大写,否则将无法解析。

于 2008-09-10T13:53:17.977 回答
0

您可以使用System.Threading.Thread.CurrentPrincipal.

于 2008-09-10T14:18:00.353 回答
0

Request.ServerVariables["REMOTE_USER"]

这对于您的设置未经验证,但我记得不久前使用过它。

于 2008-09-11T18:41:43.643 回答
0

试试 Request.ServerVariables("LOGON_USER")。

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

但是,这可能对您不起作用,因为您使用的是自己的自定义安全对象。如果你能弄清楚如何绕过那个登录框,或者在它要求它们之前将 NT 凭据传递给站点,那么你就一切就绪了。

于 2009-07-09T20:12:52.770 回答
0

你有没有想过模仿?您可以将用户的 NT 登录凭据存储在您的自定义安全对象中,然后在适当的时候通过代码假冒用户。

http://msdn.microsoft.com/en-us/library/aa292118(VS.71).aspx

于 2009-07-10T14:03:21.057 回答