我试图让双方的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安全设置。
如果打开在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();
}
我已经写了.NET应用程序,我已经使用Windows身份验证,我仍然可以使用User.Identity.Name
获取广告的用户名。 这通常包括课程的DC,并返回用户的SAM帐户名。 我是不是要在同一时间,但同时实现User.Identity.Name
肯定的作品分别
试试这个,如果你正在使用与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身份验证:配方
这是我在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的语句。 该DirectoryEntry
, DirectorySearcher
和SearchResult
的类来帮助你完成你所需要的。
更新2变量p可以通过更换HttpContext.Current.User.Identity
属性
更新3下面是LDAP名称的最新列表(在那里你看到searchResult.Properties.Contains(“”) 在这里 ,它指向不同的用户在活动目录属性
我给一个尝试:
var i = Environment.CurrentUser;
你也可以使用我的课: http://pastebin.com/xnYfVsLX