假设我们有一个PC站(Windows 10(加入了Active Directory,并且有一个用户登录了。
我有一个应用程序(客户端层直接连接到数据库(。目前,应用程序在启动时提示输入登录名/密码,但是我想更改它,如果当前用户已连接到域(登录系统(,请立即授予他访问权限,而无需提示输入凭据。
我可以想象,一旦用户登录到系统,该帐户可能会同时被禁用,或者需要更改密码或密码过期。由于我没有该帐户的密码,因此问题是
如何验证当前登录的用户在活动目录中,以衡量我是否可以授予他访问应用程序的权限?
你可以检查WindowsIdentity:
bool System.Security.Principal.WindowsIdentity.GetCurrent().IsAuthenticated;
string System.Security.Principal.WindowsIdentity.GetCurrent().IsAuthenticated.Name;
这是我的解决方案。它到达AD目录并检查帐户是否确实存在,并验证其已启用的身份验证属性。也许有人会帮忙。
public class ADAuthentication
{
private string userPrincipalName = UserPrincipal.Current.UserPrincipalName;
private string userName = Environment.UserName;
public string UserPrincipalName
{
get { return userPrincipalName; }
set { userPrincipalName = value; }
}
public string Username
{
get { return userName; }
set { userName = value; }
}
private string domainName;
private string container;
public enum AuthenticationMode { Credentials, ActiveDirectory };
public AuthenticationMode GetAuthenticationType()
{
if (String.Equals(domainName, Environment.UserDomainName, StringComparison.OrdinalIgnoreCase))
{
try
{
using (var domainContext = new PrincipalContext(ContextType.Domain, domainName, container))
{
using (var foundUser = UserPrincipal.FindByIdentity(domainContext, IdentityType.UserPrincipalName, userPrincipalName))
{
if (foundUser != null && foundUser.Enabled == true)
return AuthenticationMode.ActiveDirectory;
}
}
}
catch (AuthenticationException)
{
return AuthenticationMode.Credentials;
}
catch (PrincipalServerDownException)
{
return AuthenticationMode.Credentials;
}
}
return AuthenticationMode.Credentials;
}
public ADAuthentication (string domainName)
{
if (string.IsNullOrWhiteSpace(domainName))
throw new InvalidOperationException("The domainName parameter is required.");
string[] parts = domainName.Split('.');
this.domainName = parts[0];
this.container = string.Empty;
for (int i = 0; i < parts.Length; i++)
{
string separator = string.IsNullOrEmpty(container) ? "" : ",";
this.container += string.Format("{0}DC={1}", separator, parts[i]);
}
}
}