如何验证域凭据(来自本机代码)?

2024-02-06

我想针对域控制器验证一组凭据。例如。:

Username: joel
Password: splotchy
Domain:   STACKOVERFLOW

在 .NET 3.5 及更高版本中您可以使用PrincipalContext.ValidateCredentials(username, password) https://stackoverflow.com/a/327073/12597.

否则你就有麻烦了。

按照 Microsoft 知识库文章中的代码进行操作如何在 Microsoft 操作系统上验证用户凭据 http://support.microsoft.com/kb/180548,我到了你打电话的地方AcceptSecurityContext http://msdn.microsoft.com/en-us/library/windows/desktop/aa374705(v=vs.85).aspx:

ss = AcceptSecurityContext(
      @pAS._hcred,           //[in]CredHandle structure
      phContext,             //[in,out]CtxtHandle structure
      @InBuffDesc,           //[in]SecBufferDesc structure 
      0,                     //[in]context requirement flags
      SECURITY_NATIVE_DREP,  //[in]target data representation
      @pAS._hctxt,           //[in,out]CtxtHandle strcture
      @OutBuffDesc,          //[in,out]SecBufferDesc structure
      ContextAttributes,     //[out]Context attribute flags
      @Lifetime);            //[out]Timestamp struture

除非该函数失败并显示:

SEC_E_NO_AUTHENTICATING_AUTHORITY http://msdn.microsoft.com/en-us/library/windows/desktop/aa374705%28v=vs.85%29.aspx(0x80090311)

功能失败。无法联系任何机构进行身份验证。这可能是由于以下条件造成的:

  • 认证方域名不正确。
  • 该域不可用。
  • 信任关系失败。

这将是一个有用的错误,除了我可以使用以下方法验证 .NET 3.5 中的相同凭据:

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, domain))
{
    valid = context.ValidateCredentials(username, password);                
}

可能会发生什么情况,导致 .NET 可以验证一组凭据,而本机代码却不能?


Update: LogonUser也失败:

LogonUser("[email protected] /cdn-cgi/l/email-protection", null, "splotchy", 
      LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, out token);

with

1311 - There are currently no logon servers available to service the logon request

更新二: 我已经尝试了两种首选Negotiate提供程序,以及 Windows NT4 旧版“NTLM”提供程序

String package = "Negotiate"; //"NTLM"

QuerySecurityPackageInfo(package, [out] packageInfo);
...
AcquireCredentialsHandle(
      null,                 //[in] principle
      package,              //[in] package
      SECPKG_CRED_OUTBOUND, //[in] credential use
      null,                 //[in] LogonID
      pAuthIdentity,        //[in] authData
      null,                 //[in] GetKeyFn, not used and should be null
      null,                 //[in] GetKeyArgument, not used and should be null
      credHandle,           //[out] CredHandle structure
      expires);             //[out] expiration TimeStamp structure

我认为这是为了解决与另一个相同的问题question https://stackoverflow.com/questions/9788318/what-targetname-to-use-when-calling-initializesecuritycontext-negotiate你发布的。

我有点明白你现在想做什么。让我回顾一下您在另一篇文章中写的内容。

Username  Password  Domain             Machine on domain?  Validate as
========  ========  =================  ==================  ============== 
iboyd     pass1     .                  No                  Local account 
iboyd     pass1     (empty)            No                  Local account
iboyd     pass1     stackoverflow.com  No                  Domain account
iboyd     pass1     .                  Yes                 Local account
iboyd     pass1     (empty)            Yes                 Domain account
iboyd     pass1     stackoverflow.com  Yes                 Domain account

你想要

  1. 对来自您的计算机不信任的域的用户进行身份验证
  2. 对来自您的计算机信任的域的用户进行身份验证
  3. 验证本地用户

您可以通过与域控制器进行正确的 SSPI 握手来实现前两种情况。您在另一个问题中提到的知识库文章正在执行环回 SSPI 握手。在第一种情况下它不起作用,因为客户端计算机不信任您正在验证的域。这应该就是你看到的原因SEC_E_NO_AUTHENTICATING_AUTHORITY.

简而言之,如果您想做与

PrincipalContext.ValidateCredentials(username, password);

您需要以不同于域用户的方式处理本地用户。对于域用户,您需要调用ldap_bind_s http://msdn.microsoft.com/en-us/library/windows/desktop/aa366156%28v=vs.85%29.aspx使用给定的凭据绑定到域控制器。对于本地用户,您需要使用AD开放对象 http://msdn.microsoft.com/en-us/library/windows/desktop/aa772238%28v=vs.85%29.aspx绑定到WinnT://您的计算机名使用给定的凭据。这是什么PrincipalContext.ValidateCredentials根据我在 Reflector 中读到的内容进行操作。

我不认为有任何等效的单一原生 API 可以为您做同样的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何验证域凭据(来自本机代码)? 的相关文章

随机推荐

  • osmdroid MapTileDownloader 现在显示 403 禁止作为 HTTP 响应

    我已经成功使用 osmdroid android 4 1 jar 一段时间来在我的应用程序中显示 OSM 地图图块 现在 从昨天开始 我根本没有显示任何图块 当我将手机连接到 PC 时 我在日志中看到 403 禁止响应 我使用 Androi
  • 使用 CSS 使图像大小为容器高度的 100%

    我环顾四周 阅读了一个又一个的解决方案 并尝试了各种方法 但从未让它正常工作 我希望图像最终根据浏览器窗口的当前高度动态调整大小 目前使用图像下方的代码是原始高度 最终比浏览器窗口大 导致出现垂直滚动条 注意 请记住 我希望使用相同数量的表
  • 为什么使用 IN(子查询)的查询比使用 IN(离散列表)的查询花费更长的时间

    这一直困扰着我 为什么这个查询 SELECT FROM TABLE WHERE value IN SELECT val FROM OTHER TABLE WHERE date lt 2014 01 01 运行速度比顺序运行此查询慢几个数量级
  • bash脚本..复制文件而不覆盖[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想知道是否可以根据原始名称将文件复制 移动到目的地 基本上 我有一个 mail 文件夹 其中有几个子文件夹 例如 cur 和 new 等 然后我在
  • 计算 PHP 类的创建次数

    我有一个 php 类 我为其创建了多个实例 我想计算一下我创建该对象的次数 有没有办法知道我已经创建了 3 个 myObjects 您可以创建一个static http php net manual en language oop5 sta
  • 无法安装自制程序

    我有一台相当新的 macbook pro 我只是尝试按照他们网站上的说明安装自制程序 usr bin ruby e curl fsSL https raw githubusercontent com Homebrew install mas
  • NSString 属性是复制还是只读?

    我看到很多讨论说我应该使用copyNSString 属性 因为它会阻止其他人在我背后更改它 但那我们为什么不直接设置readonly财产呢 Update 谢谢回答我的问题 但问题是 对于 NSString 属性 你总是不希望别人修改它 对吧
  • Swift UITableViewAutomaticDimension 不起作用

    我的 Swift 项目中有一张这样的表 var tableView UITableView tableView UITableView tableView dataSource self tableView delegate self ta
  • 如何在android中的通知中添加按钮?

    我的应用程序播放音乐 当用户通过从屏幕顶部 或通常从平板电脑屏幕的右下角 滑动打开通知屏幕时 我想向他们展示一个按钮来停止当前播放的音乐并在以下情况下重新启动 他们要 我不打算将小部件放在用户的主屏幕上 而只是放在通知中 我怎样才能做到这一
  • 如何使用无法删除的值初始化输入,但允许用户在输入后写入

    我正在使用 Angularjs 和 bootstrap 创建一些表单 我想使用无法删除的默认值来初始化输入 我不想使输入只读或禁用它 我想用一些无法删除的文本初始化输入 但让用户在该文本后写入 Example 代码 xyz 用户想要写入的任
  • 在新版本的 matplotlib 中使用 twinx 时定义宽高比

    当前版本的 matplotlib 不允许box forced再说了 我应该怎么做同样的事情answer https stackoverflow com a 24742133 11840592 我正在使用 matplotlib 3 1 0 当
  • 如何在CSS中倾斜虚线边框?

    我正在尝试使用 CSS 为邮件应用程序设计一个信封 我的客户想要这种方式的虚线边框 如何用 CSS 边框达到这种效果 您可能需要稍微调整一下颜色 enveloppe padding 1em border 16px solid transpa
  • 在 Storybook v6.4 中加载 css 模块类时出现问题

    我在让故事书与我的 Gatsby 项目中的 css 模块完美配合时遇到问题 我能够渲染按钮组件 但它没有添加任何我的样式 在检查元素时 我只得到undefined undefined从下面的代码 按钮 jsx import React fr
  • 如何关闭 Nifi 处理器计划

    我有 GetHttp 和 InvokeHttp Nifi 处理器 它们在 Nifi 中启动流 但我希望它们仅从 URL 获取一次并将数据传递到下一个进程 使用处理器配置 我无法关闭调度 如何实现这一点 Apache NiFi 处理器和流程专
  • lambda 表达式中的返回类型错误

    以下代码在 IntelliJ 和 Eclipse 中可以正常编译 但 JDK 编译器 1 8 0 25 会报错 首先 代码 import java util function Predicate public abstract class
  • 如何将多个收件人添加到mailitem.cc字段c#

    好的 我正在处理 Outlook msg 模板 以编程方式打开它们 根据我的数据库中的内容插入值 前任 当我想在 收件人 字段添加多个收件人时 而不是执行以下操作 mailitem To a b c 我执行下面的操作 这更简单 尤其是当我循
  • iPhone:线程+释放池+[对象释放]=“消息发送到已释放的实例”

    我在 iPhone 上运行一些小代码时遇到了麻烦 基本上 我只需按一个按钮 它就会调用runTest 它运行test后台线程上的方法 这就是我创建自动释放池的原因 如果我运行下面的代码 我会在控制台上收到一条漂亮的消息 2010 09 07
  • AWS 公共 IP 限制是多少? (公共IP不是弹性IP)

    对于给定的 AWS 区域 您可以使用的公共 IP 数量是否有限制 不是弹性 IP 注意 我知道您最多只能使用 5 个弹性 IP 但是 如果您在创建 AWS 实例时选择 自动分配 IP 您将获得一个 IP 该 IP 在重新启动时会发生变化 我
  • 有没有办法将 ProGuard 与 MonoDroid 一起使用?

    我们的开发团队刚刚 大部分 在 Visual Studio 中使用 MonoDroid 完成了一个 Android 应用程序 因为它与银行业务有关 所以我们想尝试对其进行混淆 以增加一些安全性 防止任何人试图反编译它 最初 我认为我可以只使
  • 如何验证域凭据(来自本机代码)?

    我想针对域控制器验证一组凭据 例如 Username joel Password splotchy Domain STACKOVERFLOW 在 NET 3 5 及更高版本中您可以使用PrincipalContext ValidateCre