从Asp.Net MVC中的Active Directory获取当前经过Windows身份验证的用户

时间:2018-03-23 11:00:22

标签: c# asp.net-mvc-5 active-directory windows-authentication

我有一个Web应用程序,用户需要创建/编辑/删除帖子操作的权限。根据Windows用户名和自定义角色名称在数据库中的自定义表中处理权限。

这是我的代码:

var username = Environment.UserName;

using (HostingEnvironment.Impersonate())
{
    var ctx = new PrincipalContext(ContextType.Domain);
    var user = UserPrincipal.FindByIdentity(ctx, username);

    if (user != null)
    {
        var roleName = accessRepository.GetRole(username);

        if (string.IsNullOrEmpty(roleName) || roleName != Roles.admin.ToString())
        {
            hasAccess = false;
        }
    }
    else
    {
        hasAccess = false;
    }

    if (!hasAccess)
    {
        // redirect
    }
}

在web.config中我有

<authentication mode="Windows" />

我尝试过设置

<identity impersonate="true" />

但它不起作用。在服务器上,我尝试设置IIS以在三者的所有变体中启用Asp.Net Impersonate和匿名访问以及Windows身份验证。

当我在我的机器上本地运行时没有问题,username是我登录到我的机器时Windows身份验证的用户名。

但是当我将其上传到服务器并转到本地计算机上的网站时,username是来自服务器的用户名,而不是来自我本地计算机的用户名。

为了清楚起见,我不希望用户登录Web应用程序。我希望Web应用程序从活动目录中找出Windows身份验证。

这不可能吗?或者我认为不对?

1 个答案:

答案 0 :(得分:1)

  

为了清楚起见,我不希望用户登录网络   应用。我希望Web应用程序找到窗口   来自活动目录的身份验证。

这是不太有意义的部分。找出用户的AD帐户的唯一方法是他们是否对您的应用程序进行身份验证。他们不必输入凭据 - 但他们的凭据仍会发送到您的服务器,而您的服务器会验证它们是否正确。所以从这个意义上说,他们正在“登录”。

这是通过Windows身份验证实现的。你正走在正确的轨道上:

string sqlQuery ="Select Count("+columName+") from tblAttendance1 where "+columName+"='"+value+"'";

但请确保您还禁用匿名身份验证。然后您可以像这样访问用户的用户名:

<authentication mode="Windows" />

将采用DOMAIN \ Username。

的格式

作为旁注,HttpContext.Current.User.Identity.Name 获取当前线程正在运行的用户名 - 基本上,IIS正在运行的凭据。在您的开发机器上,这是您的用户名(可能是因为您使用的是IIS Express)。但是在服务器上,它会有所不同。