自动登录到Active Directory

时间:2011-02-01 17:41:51

标签: c# .net active-directory single-sign-on directoryservices

我在桌面Active Directory应用程序中为用户执行自动登录时遇到了一些困难。我可能正在尝试进行SSO,但我的印象是仅适用于Web应用程序。

我的代码是:

PrincipalContext theContext = new PrincipalContext(ContextType.Domain);
if (theContext.ValidateCredentials(null, null))
    Console.WriteLine("Credentials have been validated. Tell your friends.");
else
    Console.WriteLine("Invalid credentials");
UserPrincipal user = new UserPrincipal(theContext, "uatu", "Passw0rd", true);
user.Save();

正在创建PrincipalContext而没有错误,我正在验证凭据。我以为这会验证我是登录到Active Directory域下的计算机的用户。我可以找到用户和组。但是一旦我调用user.Save(),我就会收到错误“访问被拒绝”。我实际上是以访客用户身份进入Active Directory吗?

如果我在ValidateCredentials中设置了用户名和密码,则无效。

PrincipalContext theContext = new PrincipalContext(ContextType.Domain);
if (theContext.ValidateCredentials("<username>", "<password", ContextOptions.Negotiate | ContextOptions.Signing | ContextOptions.Sealing))
    Console.WriteLine("Credentials have been validated. Tell your friends.");
else
    Console.WriteLine("Invalid credentials");
UserPrincipal user = new UserPrincipal(theContext, "uatu", "Passw0rd", true);
user.Save();

该代码在user.Save()上仍然失败。 如果我明确设置用户名和密码以匹配我自己作为PrincipalContext构造函数中的登录用户,那么我就会成功。

PrinicipalContext  theContext = new PrincipalContext(ContextType.Domain,"<address>", "<domain context>", "<username>", "<password>");
UserPrincipal user = new UserPrincipal(theContext, "uatu", "Passw0rd", true);
user.Save();

该代码成功。但我宁愿让用户在使用完全相同的凭据登录计算机后登录我的应用程序。

我听过一些关于“联盟应用程序”的内容,所以我想知道是否必须让Active Directory知道它可以信任我的应用程序。我对细节仍然很朦胧,不知道这是不是错误的方向。

有没有人知道我应该做什么?

1 个答案:

答案 0 :(得分:3)

如果您要修改UserPrincipals,则可以选择以下几种方法:

  1. 用户已经作为具有编辑活动目录权限的用户对Windows进行了身份验证:
    • 使用不带用户名/密码的PrincipalContext构造函数
      • 这将以当前登录用户身份运行上下文
    • 运行查询,var usr = UserPrincipal.FindByIdentity(ctx, "bob@domain.local");
    • usr对象
    • 执行操作
    • 从查询中调用返回用户的usr.Save();
  2. 用户已通过Windows身份验证,但您必须“模拟”具有AD权限的用户
    • 使用带有用户名/密码的PrincipalContext构造函数
      • 这会将上下文作为您在
      • 中传递的凭据运行
    • 运行查询,var usr = UserPrincipal.FindByIdentity(ctx, "bob@domain.local");
    • usr对象
    • 执行操作
    • 从查询中调用返回用户的usr.Save();
  3. 根据你上面的解释,我假设你需要选项#1。 ValidateCredentials();仅用于验证凭据,如果您提供的凭据有效,则返回true / false。调用它没有持久影响,它只能验证。如果您需要模拟用户,则需要使用带有凭据的PrincipalContext构造函数。