我在桌面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知道它可以信任我的应用程序。我对细节仍然很朦胧,不知道这是不是错误的方向。
有没有人知道我应该做什么?
答案 0 :(得分:3)
如果您要修改UserPrincipals
,则可以选择以下几种方法:
PrincipalContext
构造函数
var usr = UserPrincipal.FindByIdentity(ctx, "bob@domain.local");
usr
对象usr.Save();
。PrincipalContext
构造函数
var usr = UserPrincipal.FindByIdentity(ctx, "bob@domain.local");
usr
对象usr.Save();
。根据你上面的解释,我假设你需要选项#1。 ValidateCredentials();
仅用于验证凭据,如果您提供的凭据有效,则返回true / false。调用它没有持久影响,它只能验证。如果您需要模拟用户,则需要使用带有凭据的PrincipalContext
构造函数。