在ASP.NET的ActiveDirectory当前用户名(ActiveDirectory Curr

2019-06-24 10:23发布

我试图让双方的ActiveDirectory和标准格式登录进行工作,但有一点是阻止我。 我不能让当前的Windows用户的名称。 我得到的最接近是var i = WindowsIdentity.GetCurrent(); ,但给我的IIS应用程序池的用户名。 我有匿名身份验证,窗体身份验证和IIS中启用Windows身份验证。 所以我想我的web.config是设置正确,我可以加载从AD用户。

编辑 :这是我的web.config(使用门面提供商):

<membership defaultProvider="HybridMembershipProvider">
      <providers>
        <clear />
        <add name="HybridMembershipProvider" type="MyApp.Data.HybridMembershipProvider" AspNetProviderName="AspNetSqlMembershipProvider" ActiveDirectoryProviderName="ADMembershipProvider" />
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="MyAppConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="4" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
        <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADConnectionString" 
            attributeMapUsername="sAMAccountName" enableSearchMethods="true" attributeMapEmail="mail"/>
      </providers>
    </membership>

编辑2:这是我的IIS安全设置。

Answer 1:

如果打开在IIS ASP.Net模拟,你可以像你想获得的用户名。 这如果该数据是在表单成员资格提供/ AD只会工作,他们是不是匿名的。

此外,混合基于表单和Windows / AD基于身份验证是可行的,但不建议使用。 见这个 ,如果你需要做的。

编辑 :我想我误解你想要什么,所以这里有一个高层次的东西与上述方案继续粉饰:

如果关闭匿名身份验证,并打开Asp.Net模拟,IIS将每当有人访问该网站做了401挑战。
如果一切都在同一个域,Web浏览器将发送您的凭据到IIS,IIS将验证他们反对的Active Directory,然后AD会给IIS的身份进行工作。

当你Asp.Net模拟开启,IIS会然后绑定该身份到当前线程/请求。 验证操作后,您可以随意在当前线程身份的用户名,然后查询Active Directory,如:

using System.Threading;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;

......

PrincipalContext pc = null;
UserPrincipal principal = null;

try
{
    var username = Thread.CurrentPrincipal.Identity.Name;
    pc = new PrincipalContext(ContextType.Domain, "active.directory.domain.com");
    principal = UserPrincipal.FindByIdentity(pc, username);

    var firstName = principal.GivenName ?? string.Empty
    var lastName = principal.Surname ?? string.Empty
    return string.Format("Hello {0} {1}!", firstName, lastName);
}
catch ...
finally
{
    if (principal != null) principal.Dispose();
    if (pc != null) pc.Dispose();
}


Answer 2:

我已经写了.NET应用程序,我已经使用Windows身份验证,我仍然可以使用User.Identity.Name获取广告的用户名。 这通常包括课程的DC,并返回用户的SAM帐户名。 我是不是要在同一时间,但同时实现User.Identity.Name肯定的作品分别



Answer 3:

试试这个,如果你正在使用与Active Directory窗体身份验证:

Context.User.Identity.Name

//代码段

sub Page_Load(sender as object, e as EventArgs)
  lblName.Text = "Hello " + Context.User.Identity.Name & "."
  lblAuthType.Text = "You were authenticated using " &   Context.User.Identity.AuthenticationType & "."
end sub

参考:
从ASP .NET Active Directory验证
如何通过使用窗体身份验证和Visual Basic .NET对Active Directory进行鉴定, 认证,授权和安全通信:构建安全的ASP.NET应用程序

参考:您可以通过多种方式使用Windows身份验证与ASP.NET:

  • Windows身份验证不带模拟 。 这是默认设置。 ASP.NET执行操作和使用应用程序的进程标识,默认情况下是Windows Server 2003上的网络服务帐户访问资源。

  • Windows身份验证与模拟 。 通过这种方法,你冒充身份验证的用户,并使用该标识来执行操作和访问资源。

  • Windows身份验证与固定的身份模拟 。 通过这种方法,你使用特定的身份模拟一个固定的Windows帐户来访问资源。 在Windows Server 2003中,你应该避免这种模拟方法; 而是使用了自定义的服务标识的自定义应用程序池。

按照文件,你可以得到验证用户的Windows标记。

IIdentity WinId= HttpContext.Current.User.Identity;
WindowsIdentity wi = (WindowsIdentity)WinId;

如果有什么错误的,那么请检查您的应用程序模拟方法为每MSDN文档如何:使用Windows身份验证在ASP.NET 2.0

请参阅ScottGu的文章内部网ASP.NET Web应用程序中启用Windows身份验证:配方



Answer 4:

这是我在ASP.NET MVC应用程序中使用的代码段不太久以前,它帮助我,不知道它会帮助你,虽然,你可以自由地虽然检查

    private static void CheckIfUserExists(string p)
    {
        try
        {
                var user = (from x in Data.EntityDB.UserInfoes where x.SAMAccountName == p select x).FirstOrDefault();
                DirectoryEntry entry = new DirectoryEntry(Properties.Settings.Default.LDAPPath); //this is the connection to your active directory
                DirectorySearcher search = new DirectorySearcher(entry);
                search.PropertiesToLoad.Add("*");
                search.Filter = "(&(sAMAccountName=" + p + ")(objectCategory=person))";
                SearchResult searchResult = search.FindOne();
            //If the user under the alias is not found, Add a new user. Else, update his current data
            if (user == null)
            {
                XXXXXXX.Models.UserInfo newUserEntry = new Models.UserInfo
                {
                    SAMAccountName = p,
                    First_Name = searchResult.Properties.Contains("givenName") ? searchResult.Properties["givenName"][0].ToString() : string.Empty,
                    Last_Name = searchResult.Properties.Contains("sn") ? searchResult.Properties["sn"][0].ToString() : string.Empty,
                    Title = searchResult.Properties.Contains("title") ? searchResult.Properties["title"][0].ToString() : string.Empty,
                    Office = searchResult.Properties.Contains("l") ? searchResult.Properties["l"][0].ToString() : string.Empty,
                    Country = searchResult.Properties.Contains("c") ? searchResult.Properties["c"][0].ToString() : string.Empty,
                    Telephone = searchResult.Properties.Contains("telephoneNumber") ? searchResult.Properties["telephoneNumber"][0].ToString() : string.Empty,
                    Mobile_Phone = searchResult.Properties.Contains("mobile") ? searchResult.Properties["mobile"][0].ToString() : string.Empty,
                    Email_Address = searchResult.Properties.Contains("mail") ? searchResult.Properties["mail"][0].ToString() : string.Empty,
                    Image_Path = string.Format(Properties.Settings.Default.UserPicturePath, p),
                    LastUpdate = DateTime.Now,
                };

更新

采取通知,我也是在这个提取查询不同的数据库,忽略所有的Linq的语句。 该DirectoryEntryDirectorySearcherSearchResult的类来帮助你完成你所需要的。

更新2变量p可以通过更换HttpContext.Current.User.Identity属性

更新3下面是LDAP名称的最新列表(在那里你看到searchResult.Properties.Contains(“”) 在这里 ,它指向不同的用户在活动目录属性



Answer 5:

我给一个尝试:

var i = Environment.CurrentUser;

你也可以使用我的课: http://pastebin.com/xnYfVsLX



文章来源: ActiveDirectory Current Username in ASP.NET