我有一个与Windows服务对话的Web应用程序(在IIS中托管).Windows服务使用ASP.Net MVC Web API(自托管),因此可以使用JSON通过http进行通信.Web应用程序配置为进行模拟,其想法是向Web应用程序发出请求的用户应该是Web应用程序用来向服务发出请求的用户.结构如下所示:

(以红色突出显示的用户是以下示例中引用的用户.)
Web应用程序使用以下命令向Windows服务发出请求HttpClient:
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
Run Code Online (Sandbox Code Playgroud)
这会向Windows服务发出请求,但不会正确传递凭据(服务将用户报告为IIS APPPOOL\ASP.NET 4.0).这不是我想要发生的事情.
如果我将上述代码更改为使用WebClient,则会正确传递用户的凭据:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
Run Code Online (Sandbox Code Playgroud)
使用上述代码,服务将用户报告为向Web应用程序发出请求的用户.
我执行错误HttpClient导致它无法正确传递凭据(或者它是一个错误HttpClient),我做错了什么?
我想使用HttpClient它的原因是它有一个与s兼容的异步API Task,而WebClientasyc API需要用事件处理.
我想使用Windows身份验证获取用户名
实际上我实现了"以不同用户身份登录",单击此按钮时,Windows安全性将出现在那里我们可以提供凭据.
在那个时候,如果我提供一些其他凭证,它只采用当前用户名.如何从Windows安全性获取给定的凭据用户名?
IIS中的主机应用程序然后禁用匿名身份验证并启用了Windows身份验证.
web.config中:
<system.web>
<compilation debug="true" targetFramework="4.0" />
<identity impersonate="true"/>
<authorization>
<allow users="*"/>
<deny users="*"/>
</authorization>
</system.web>
<system.webServer>
<directoryBrowse enabled="true" />
<security>
<authentication>
<anonymousAuthentication enabled="false" />
<windowsAuthentication enabled="true" />
</authentication>
</security>
Run Code Online (Sandbox Code Playgroud)
的.cs
在这里,我总是得到默认的用户名
string fullName = Request.ServerVariables["LOGON_USER"];
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?提前致谢
c# asp.net authorization windows-authentication windows-security
堆栈溢出有几个与此类似的问题,但不完全相同.
我想在win xp计算机上打开或创建一个本地组,并向其添加成员,域名,本地和众所周知的帐户.我还想检查一个用户是否已经是一个成员,这样我就不会两次添加同一个帐户,并且可能会出现异常.
到目前为止,我开始将DirectoryEntry对象与WinNT://提供程序一起使用.这样可以,但是我仍然坚持如何获得一个组成员列表?
有人知道怎么做吗?或者提供比使用DirectoryEntry更好的解决方案?
.net c# active-directory windows-security active-directory-group
某些Windows API返回主令牌,有些返回模拟令牌.某些API需要主令牌,而其他API则需要模拟令牌.
例如,LogonUser通常返回主令牌,除非LOGON32_LOGON_NETWORK用作登录类型(dwLogonType)时:
在大多数情况下,返回的句柄是您可以在调用CreateProcessAsUser函数时使用的主令牌.但是,如果指定LOGON32_LOGON_NETWORK标志,则LogonUser将返回您无法在CreateProcessAsUser中使用的模拟标记,除非您调用DuplicateTokenEx将其转换为主标记.
SetThreadToken需要一个模拟令牌,而ImpersonateLoggedOnUser这似乎做同样的事情需要一个.
CreateProcessAsUser并且CreateProcessWithTokenW两者都需要一个主令牌,并注意可以通过调用从模拟令牌中获取主令牌DuplicateTokenEx,但令牌类型是什么意思?
词汇表说明如下:
访问令牌包含登录会话的安全信息.系统在用户登录时创建访问令牌,并且代表用户执行的每个进程都具有令牌的副本.令牌标识用户,用户的组和用户的权限.系统使用令牌来控制对安全对象的访问,并控制用户在本地计算机上执行各种系统相关操作的能力.有两种访问令牌,主要和模拟.
通常仅由Windows内核创建的访问令牌.可以将其分配给进程以表示该进程的默认安全信息.
已创建的访问令牌,用于捕获客户端进程的安全信息,允许服务器在安全操作中"模拟"客户端进程.
但这并不完全有用.似乎有人想要使用像"内核"这样的大男孩字样,但这只会引发更多问题,例如除了被分配到进程之外还可以使用主要令牌以及除了内核之外的其他人可以创建访问权限令牌?
(他们的意思是微软的意思,内核只是内核模式运行的一部分,还有执行等等,或者他们是否意味着用户模式代码也可以创建令牌?无论如何,即使用户 - 模式代码可以创建令牌,它必须通过系统调用来完成,就像任何对象管理器对象一样,所以无论如何,令牌实际上都是以内核模式创建的.)
无论如何,这并没有回答基本问题:令牌类型之间有什么区别?不是它们可能被用于什么或通常如何创建它们.
为了将新的属性页安装到Active Directory SnapIn中,我需要写入W2K8 R2的以下注册表项(如Microsoft所述)
HKEY_LOCAL_MACHINE\SOFTWARE \微软\ MMC\SnapIns {E355E538-1C2E-11D0-8C37-00C04FD8FE93}\NodeTypes
此密钥由名为TrustedInstaller的特殊用户拥有.我在NET arround上发现了很多东西.
目前,这是它的工作方式,执行以下操作(用户是管理员组的成员):
我的项目是用C#完整编写的,有两件事我不喜欢这样做.
所以我的问题是:我是否遗漏了某些东西,是否有记录的方法来修改这样一个被记录为可修改的密钥?
有一个Stack溢出问题存在,答案说TrustedInstaller所有权,意味着密钥是系统安装的一部分而不是应用程序安装.对我来说,如果Microsoft记录了如何修改它的应用程序安装的密钥.
提前致谢.
c# registry windows-installer windows-security windows-server-2008-r2
是否有生成SDDL(安全描述符定义语言)字符串的工具?我想通过Windows的安全属性表或类似的东西来创建它们.
我们的组织最近获得了EV code signing certificate. 它确实给了我们即时SmartScreen信任,但仍然发生了两件事:
一个小烦恼是,它向前几个下载者Chrome发出了警告file.exe is not commonly downloaded and may be dangerous,但它在一天之内就消失了,我们没有采取任何措施。
一个更大的问题是Windows Defender。它的作用如下:
当我们的用户安装该程序时,它会标记并锁定所需的关键组件。大多数用户都会遇到这种情况。
\n我们在上传之前在本地扫描了程序组件,没有发现任何问题。我们的Virus & threat protection是最新的。当我们从网站下载相同的文件并像普通用户一样安装时,我们也不会触发防病毒保护。为什么它的行为如此不一致,以至于当我们从互联网下载到内部 PC\xe2\x80\x99s 上时,它不会标记文件\xe2\x80\x99s,但大多数外部用户都会发生这种情况?
到目前为止,我们一直在从用户那里收集这些通用威胁名称和文件名,并将其提交给微软进行分析:https://www.microsoft.com/en-us/wdsi/filesubmission \n令人非常钦佩的是微软的分析师在一天内查看这些文件,但不好的是他们似乎只更新检测到的威胁名称的防病毒定义,而不是将整个文件标记为无害。这个问题变得更加令人沮丧,因为我们经常更新我们的安装程序,因为程序正在积极开发中。
\n我还担心这些带有 MS 威胁定义的更新没有足够快地正确传播给世界各地的 Windows 用户。如果用户不更新其定义或将其关闭,会发生什么情况?
\n有什么我们尚未采取但可以采取的措施来减少这些误报问题吗?
\nEV代码签名证书由DigiCert颁发,价格非常昂贵。MS 多次扫描签名文件并提高证书的信任评分后,这些问题会消失吗?我的意思是,它会减少尚未提交分析的未来构建的误报吗?
\ncode-signing windows-security windows-defender digicert ev-certificate
我在使用WCF服务和模拟方面遇到了一些问题,我已将其提炼为下面的简单方法.WCF服务目前在exe中自托管.异常消息是"未提供所需的模拟级别,或者提供的模拟级别无效".检查错误何时抛出,Identity ImpersonationLevel设置为委托,如我的客户端上指定的,并通过Kerberos进行身份验证.
我有点困惑,因为在我看来,已经满足了ImpersonationLevel和Authenticaiton的要求.我的想法是问题可能与域设置有关,我已经设置并认为设置正确.所以我有两个问题:
代码如下:
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string Test()
{
WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity;
using (identity.Impersonate())
{
ProcessStartInfo pi = new ProcessStartInfo(@"c:\temp\test.bat");
pi.UseShellExecute = false;
pi.RedirectStandardOutput = true;
Process p = Process.Start(pi); // exception thrown here!
p.WaitForExit();
string o = p.StandardOutput.ReadToEnd();
return o;
}
}
Run Code Online (Sandbox Code Playgroud)
例外细节:
Win32Exception occurred: Either a required impersonation level was not provided, or the provided impersonation level is invalid
at System.Diagnostics.Process.CreatePipeWithSecurityAttributes(SafeFileHandle& hReadPipe, SafeFileHandle& hWritePipe, SECURITY_ATTRIBUTES lpPipeAttributes, Int32 nSize)
at System.Diagnostics.Process.CreatePipe(SafeFileHandle& parentHandle, SafeFileHandle& childHandle, …Run Code Online (Sandbox Code Playgroud) 在搜索Windows身份验证方法和协议之后,我决定在使用IIS和Web身份验证之前了解简单可执行文件中使用的Negotiate,Kerberos和NTLM之间的确切区别.
我达到了很好的效果,但我还需要有关Negotiate和Kerberos的更多细节.
我有以下场景:
我创建了非常简单的C#窗体表单应用程序,它显示了一个消息框显示的值:
System.Security.Principal.WindowsIdentity.GetCurrent().AuthenticationType
Run Code Online (Sandbox Code Playgroud)
请注意,我是在本地计算机上具有管理员权限的域用户,我有以下结果:
当我在主动连接到DC时运行exe文件(双击)时,我得到了"Negotiate".
当我运行exe文件(作为varynet用户/使用本地用户运行),而我主动连接到DC时,我得到了"NTLM".
当我使用"以管理员身份运行"或"以不同用户身份运行"运行exe文件时,我得到了"Kerberos".
当我使用本地帐户本地登录时运行exe文件时,我得到了"NTLM".
我知道LSA会将NTLM用于本地帐户.另外我知道Active Directory使用Kerberos来验证域用户和计算机.
我的问题是,当我使用我的帐户(双击)或使用我的同一帐户"以不同用户身份运行"运行exe时,为什么我会获得协商身份验证类型?
更新:我注意到以下内容:
- 如果本地用户正在运行exe,那么它是NTLM
- 如果域用户运行exe然后它是Negotiate(如果该用户是本地管理员)但是是Kerberos(如果该用户不是本地管理员) )
- 如果域管理员运行exe,那么它是Kerberos
我只是澄清了这种行为.
ntlm kerberos windows-authentication windows-security negotiate
我使用的是最新版本的 Microsoft Edge(版本 81.0.416.68(官方版本)(64 位))。当我尝试登录特定站点(而不是所有站点)时,会弹出“Windows 安全”对话框,然后是“登录以访问此站点”,询问用户名和密码。使用 Chrom 我只是收到“登录”对话框,询问用户名和密码。
所以我的问题是,为什么 Microsoft Edge 有“Windows 安全”对话框,即使它没有像另一个对话框一样预先填写任何保存的用户名和密码,这也很烦人?
如何禁用此功能,获得一个带有预填充保存的用户名和密码的正常“登录”对话框,或者我需要在“Windows 安全”对话框中为预填充保存的用户名和密码进行一些设置?