2

我继承了一个使用表单身份验证的项目,但最近的一个功能请求要求我获取某些用户的 Windows 用户名。

这是一个使用表单身份验证的网站(我不想更改这一点,此时工作量太大)但我有一个功能请求,允许我们的内部用户更轻松地登录(通常无需输入他们的密码或用户名)。

我当前的方法是可怕的,它涉及检查 IP 地址以查看它们是否从我们的一个 IP 连接,如果是,则将它们重定向到使用 Windows 身份验证的单独项目,然后将它们重定向回原始页面包含他们用户名的查询字符串(如果我被迫继续使用这种方法,我可能需要对其进行加密,尽管它仍然没有我想要的那么安全)。

我可以在我的应用程序中相对轻松地执行 windows 身份验证,但困难的部分是获取 windows 用户名。我不知道该怎么做,因此我的方法很丑。

任何帮助将不胜感激。

编辑:我的辅助应用程序只是这样做:

string username = HttpContext.Current.User.Identity.Name;
string retpath = Request.QueryString["retpath"];
Response.Redirect("http://" + retpath + "?id=" + username);
4

2 回答 2

1

这篇文章包含了答案,(感谢 vinodpthmn): http: //msdn.microsoft.com/en-us/library/ms972958.aspx 我在研究中找到了这篇文章的链接,但没有一个有效!很高兴我终于能够阅读并解决我的问题。

正如我所提到的,我只需要获取客户端的 windows 用户名,但结果证明这很麻烦,幸好实际的解决方案相对简单。

首先,您需要创建一个额外的登录页面(我称为 winlogin.aspx)并将其设置为 Web.Config 文件中的默认登录页面,如下所示:

<authentication mode="Forms">
      <forms name="something" defaultUrl="default.aspx" loginUrl="winlogin.aspx" protection="All" slidingExpiration="true" timeout="90"/>
    </authentication>

在 winlogin.aspx.cs 文件中,您可以在其中验证 Windows 用户并使用

FormsAuthentication.RedirectFromLoginPage(username, false/true);

将他们重定向到他们要去的任何地方。实际的 winlogin.aspx 页面应该是空白的,用户永远不会看到它。

您需要为下一部分发布到您的测试 Web 服务器:您在 IIS 管理器中访问 winlogin.aspx 的文件属性并将 WindowsAuthentication 设置为 true 并将 Anonymous Authentication 设置为 false。您还需要创建一个自定义的 401 错误页面指针(我的指向我的旧 Login.aspx 页面)。

可以使用 Windows 身份验证登录的用户将这样做,其他人将被重定向到旧的登录页面。

瞧!

但是有几个问题,您丢失了返回 URL(您不能在指向自定义 401 错误页面的链接中使用“=”,因此无法解析任何内容)因此您可能希望在有人时设置 cookie被重定向到 winlogin 页面并访问表单登录页面中的 cookie 以适当地重定向用户。

如果有人有任何问题,我建议阅读上面链接的文章,或者随时在这里提问。

谢谢大家的帮助!

于 2012-10-23T06:09:46.733 回答
-1

您可以使用目录服务

PrincipalContext pc = null;
UserPrincipal principal = null;
var username = User.Identity.Name;
pc = new PrincipalContext(ContextType.Domain, "give your domain name here");
principal = UserPrincipal.FindByIdentity(pc, userName);
var firstName = principal.GivenName ?? string.Empty;
var lastName = principal.Surname ?? string.Empty;

请为 System.DirectoryServices.AccountManagement 添加参考

于 2012-10-22T05:52:32.110 回答