Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ASP.NET MVC进行Windows身份验证_Asp.net_Asp.net Mvc_Windows Authentication - Fatal编程技术网

使用ASP.NET MVC进行Windows身份验证

使用ASP.NET MVC进行Windows身份验证,asp.net,asp.net-mvc,windows-authentication,Asp.net,Asp.net Mvc,Windows Authentication,我为我的asp.net mvc 1.0 web应用程序构建了一个自定义登录系统,因为我为每个用户存储了大量的用户数据(因此我决定不尝试为windows身份验证添加自定义表)。登录系统基本上使用SQL Server(2005或2008)和我自己的数据库和表结构,这是相当标准的。具有唯一id、用户名和哈希密码的用户表,该表链接到我的其他用户相关数据表 我的问题是,如何将我的系统绑定到使用Windows身份验证登录。我想允许管理员为用户(在我的系统中定义)选择一个Windows身份验证登录,并可能在我

我为我的asp.net mvc 1.0 web应用程序构建了一个自定义登录系统,因为我为每个用户存储了大量的用户数据(因此我决定不尝试为windows身份验证添加自定义表)。登录系统基本上使用SQL Server(2005或2008)和我自己的数据库和表结构,这是相当标准的。具有唯一id、用户名和哈希密码的用户表,该表链接到我的其他用户相关数据表

我的问题是,如何将我的系统绑定到使用Windows身份验证登录。我想允许管理员为用户(在我的系统中定义)选择一个Windows身份验证登录,并可能在我的自定义表中添加一个值,我可以使用该值对他们进行身份验证


这个问题的措辞可能是错误的,我可能误解了Windows身份验证的工作原理,但我想在我的web应用程序中提供此选项。

如果我正确理解您的问题,您想添加一些链接到Windows身份验证用户名的其他数据吗

如果是这样,则需要将用户名和此自定义信息存储在新表中。windows身份验证数据存在于Active Directory中,因此您可以在那里查看以获取用户列表。当Windows对用户进行身份验证时,您不会自动将任何自定义信息添加到AD中。如果您想要任何自定义信息,您需要将自定义查找添加到AD中,或者根据您决定存储信息的位置在数据库中查找自定义数据

通过Windows身份验证,您几乎可以获得用户的用户名以及检查与该用户关联的角色(广告组)的能力。除此之外,您需要手动编写代码

我最近询问了在MVC内置安全性之外实现定制的问题,并提出了自己的解决方案。也许有一些小道消息可以帮助你回答你的问题:


如果您的站点上启用了Windows身份验证,那么您应该能够使用User.Identity.Name获取当前登录用户的NT/Active Directory用户名,并将其与用户表中的一列相匹配。

以下是我们为混合表单/Windows身份验证应用程序所做的操作:-

public class MyBaseController
{
  protected override void OnAuthorization( AuthorizationContext authContext )
  {
    if
    (
      !User.Identity.IsAuthenticated &&
      Request.LogonUserIdentity != null &&
      Request.LogonUserIdentity.IsAuthenticated
    )
    {
      String logonUserIdentity = Request.LogonUserIdentity.Name;
      if ( !String.IsNullOrEmpty(logonUserIdentity) )
      {
        User loginUser =
          Context.Users.FirstOrDefault(
            x => x.UserIdentity == logonUserIdentity);
        if ( loginUser != null )
          FormsAuthentication.SetAuthCookie(
            loginUser.LoginName,createPersistentCookie);
    }
  }

为了简洁起见,我去掉了一些封装。

我不知道确切的答案,但是:我认为要使用windows auth,您需要设置active directory,并为网络中的每个人指定一个用户。然后,我认为您需要使用web.config模拟asp.net用户,您应该可以开始了。因此,在我的actionfilter HttpContext.Current.user.Identity.Name中使用,我可以访问我的用户名(MACHINE\PHIL),并设置IsAuthenticated。因此,我所需要做的就是在我的用户表中添加另一列,将我的用户名与user.IDentity.Name关联,并检查它们是否经过身份验证?如果user.IDentity.Name返回一个值,则它们已通过身份验证。更重要的是,除非经过身份验证,否则他们将无法访问页面(IIS将强制他们在呈现页面之前进行身份验证)。有用的评论,一些不错的背景阅读和其他想法。Iain,你介意发布更多的代码吗?我对正确封装此功能以及如何配置IIS感兴趣(我自己也在使用IIS 7)。谢谢