相关疑难解决方法(0)

验证Active Directory的用户名和密码?

如何针对Active Directory验证用户名和密码?我只是想检查用户名和密码是否正确.

c# authentication active-directory

512
推荐指数
11
解决办法
45万
查看次数

如何验证域凭据?

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

Username: STACKOVERFLOW\joel
Password: splotchy
Run Code Online (Sandbox Code Playgroud)

方法1.使用模拟查询Active Directory

很多人建议查询Active Directory.如果抛出异常,那么您知道凭据无效 - 正如此stackoverflow问题中所建议的那样.

然而,这种方法有一些严重的缺点:

  1. 您不仅要对域帐户进行身份验证,还要进行隐式授权检查.也就是说,您正在使用模拟令牌从AD中读取属性.如果其他有效帐户无权从AD读取,该怎么办?默认情况下,所有用户都具有读取权限,但可以将域策略设置为禁用受限帐户(和/或组)的访问权限.

  2. 绑定AD会产生严重的开销,必须在客户端加载AD架构缓存(DirectoryServices使用的ADSI提供程序中的ADSI缓存).这既是网络又是AD服务器,消耗资源 - 而且对于像验证用户帐户这样的简单操作来说太昂贵了.

  3. 您依赖于非例外情况的异常失败,并假设这意味着无效的用户名和密码.然后,其他问题(例如,网络故障,AD连接故障,内存分配错误等)被错误地表示为身份验证失败.

方法2. LogonUser Win32 API

其他人建议使用LogonUser()API函数.这听起来不错,但不幸的是,调用用户有时需要一个权限,通常只给操作系统本身:

调用LogonUser的进程需要SE_TCB_NAME权限.如果调用进程没有此权限,LogonUser将失败,GetLastError将返回ERROR_PRIVILEGE_NOT_HELD.

在某些情况下,调用LogonUser的进程还必须启用SE_CHANGE_NOTIFY_NAME权限; 否则,LogonUser失败,GetLastError返回ERROR_ACCESS_DENIED.作为管理员组成员的本地系统帐户或帐户不需要此权限.默认情况下,为所有用户启用SE_CHANGE_NOTIFY_NAME,但某些管理员可能会为所有用户禁用它.

省高院" 法案作为操作系统的一部分 "特权是不是你想要做无可奈何的东西-作为微软在一份指出知识库文章:

...调用LogonUser的进程必须具有SE_TCB_NAME权限(在用户管理器中,这是" 作为操作系统的一部分 "权限).SE_TCB_NAME权限非常强大, 不应授予任何任意用户,以便他们可以运行需要验证凭据的应用程序.

此外,LogonUser()如果指定了空密码,则调用将失败.


验证一组域凭据的正确方法是什么?


碰巧是从托管代码调用,但这是一个普通的Windows问题.可以假设客户已安装.NET Framework 2.0.

c# windows security authentication

79
推荐指数
3
解决办法
11万
查看次数

使用C#根据LDAP对用户进行身份验证

我正在使用DirectorySearcher在LDAP服务器中搜索用户条目.

DirectoryEntry de = new DirectoryEntry();
de.Path = "LDAP://myserver/OU=People,O=mycompany";
de.AuthenticationType = AuthenticationTypes.None;

DirectorySearcher deSearch = new DirectorySearcher();

deSearch.SearchRoot = de;
deSearch.Filter = "(uid=" + model.UserName + ")";

SearchResult result = deSearch.FindOne();
Run Code Online (Sandbox Code Playgroud)

我能够在结果变量中得到预期的输出.
但是,如果我尝试通过在目录条目中提供密码来验证同一用户,我总是会收到以下错误.

"用户名或密码不正确."

DirectoryEntry entry = new DirectoryEntry("LDAP://myserver/OU=People,O=mycompany", username, password);
DirectorySearcher search = new DirectorySearcher(
    entry,
    "(uid=" + username + ")",
    new string[] { "uid" }
);

search.SearchScope = System.DirectoryServices.SearchScope.Subtree;
SearchResult found = search.FindOne();   ->>>>>this is where I get wrong credential error.
Run Code Online (Sandbox Code Playgroud)

用户名和密码适用于我要验证的用户.

任何人都可以告诉我这里我做错了什么或如何调试这个.

c# authentication ldap

21
推荐指数
1
解决办法
7万
查看次数

如何模拟双精度单精度舍入?

我有一个问题,我试图重建现有系统中使用的公式,一个输入和一个输出的相当简单的公式:

y = f(x)
Run Code Online (Sandbox Code Playgroud)

在经历了很多令人费解之后,我们设法找出了符合我们观察数据点的公式:

在此输入图像描述

正如您所看到的,我们的理论模型非常适合观察数据:

在此输入图像描述

除了我们绘制残差(即y = f(x) - actualY)时,我们看到残差中出现了一些线:

在此输入图像描述

很明显,这些线是在我们的公式中应用一些中间舍入的结果,但是在哪里不明显.最终意识到原始系统(我们正在尝试逆向工程的系统)将值存储在中间Decimal数据类型中:

  • 具有8位精度的分数
  • 使用0.5舍入舍入模型:

我们可以通过以下方式模拟分数中的这个8位精度:

multiply by 128 (i.e. 2^8)
apply the round
divide by 128 (i.e. 2^8)
Run Code Online (Sandbox Code Playgroud)

将上面的等式改为:

在此输入图像描述

显着减少了残留误差:

在此输入图像描述

现在,上述所有内容与我的问题无关,除了:

  1. 为了表明在计算机中模拟数值表示可以帮助模型
  2. 用漂亮的图片和颜色吸引人们的注意力
  3. 沉默的批评谁就会 拒绝促进直到我解释 为什么我要问我的问题

现在我想在Single Precision使用Double Precision浮点数的编程语言(和Excel)中模拟浮点数.我想这样做是因为认为这是需要的.

在上面的例子中,我认为原始系统使用的是Decimal data type with fixed 8-bit fractional …

floating-point double floating-accuracy ieee-754

16
推荐指数
2
解决办法
3782
查看次数

如何确定登录的Windows帐户是否已在域上进行身份验证

可能重复:
在客户端 - 服务器应用程序中使用Active Directory验证用户

我正在尝试使用非托管C++在我的程序中使用单点登录方法,并且需要确定当前的Windows用户是否在我的域中进行了身份验证.如果我能找到一种方法来了解用户已经过身份验证,我将允许他进入我的桌面应用程序而无需密码(用户名在我的应用程序和域中是相同的).

我可以使用ADsOpenObject()直接针对Active Directory进行身份验证,但这需要用户名,密码和权限,我只需要使用用户名,而不需要用户自己输入.

使用.net我可以使用System.DirectoryServices中的东西,就像在这个线程中一样.

据我所知,此任务可能涉及分析Windows安全kerberos令牌以正确执行.这是深入讨论这个主题,并在为Java触及线.虽然我不需要严格的SSO,因为我的应用程序不会尝试访问与域相关的任何内容.

SSPI票证方式是唯一的方式,还是可以利用ADSI/WinLogon/CredentialsCache的某些属性来使其工作?

c++ windows authentication active-directory single-sign-on

6
推荐指数
1
解决办法
3134
查看次数

如何针对域验证用户的缓存凭据?

登录到Windows时,将缓存您的凭据.这允许您使用单点登录.如果您要浏览到另一台计算机,例如:

\\hydrogen
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

系统不会提示您输入凭据.

Windows将采取您的:

  • 当前用户名
  • (哈希)密码

并尝试自动验证您.有趣的是,如果您的工作站不在域上,这甚至可以工作.连接到服务器后,Windows将自动使用您的用户名和密码.如果你的:

  • 本地用户名/密码匹配a
  • 用户名/密码

你会自动进入.

美丽的照片:

在此输入图像描述

这称为单点登录.您登录Windows一次,并且在您使用网络上的其他内容时,您的缓存凭据将用于验证您.

浏览器也这样做

Chrome,Internet Explorer和Firefox也对此进行了修改.如果您需要登录到网站,并且服务器支持协商授权,服务器将向您发回一个指示,您应该尝试使用用户的Windows /域/ Kerberos凭据:

HTTP/1.1 401 Unauthorized
Server: Microsoft-IIS/7.5
WWW-Authenticate: Negotiate
Date: Thu, 09 Jul 2015 14:35:58 GMT
Content-Length: 0
Run Code Online (Sandbox Code Playgroud)

然后,Chrome会获取您的缓存凭据,并且(经过一些中级魔法)将它们转发到Web服务器:

GET http://hr.woodglue.com HTTP/1.1
Host: hr.woodglue.com
Authorization: Negotiate YIIFzwYGKwYBBQUCoIIFwzCCBb....
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Microsoft在旧文章中讨论了Internet Explorer中的这种机制:

使用协商协议进行基于HTTP的跨平台认证

在此输入图像描述

  • 客户端调用AcquireCredentialsHandle()InitializeSecurityContext()与SPN一起构建从TGS/KDC请求会话票证的安全上下文.

您验证域,而不是服务器

我要提到的最后一点是服务器,Web服务器,工作站,文件服务器,不验证服务器的凭据,它们针对域控制器进行验证.您有许多域服务器的模糊森林,其中一个处理您的请求.

换句话说,您不会针对以下内容验证凭据:

  • \\uranium (域上的woodglue.com域控制器)

您验证凭据: …

windows security authentication windows-authentication

5
推荐指数
0
解决办法
1890
查看次数