- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
是System.Security.Principal.WindowsIdentity
合理地避免被黑客攻击,这样我从 Thread.CurrentPrincipal
得到的一个实例的 Identity
或 WindowsIdentity.GetCurrent()
其中 true
为 IsAuthenticated
提供了我的程序集虚假身份信息?当然,没有什么是完全防篡改的,但考虑到 Microsoft 对 .Net 的 promise 和依赖,我预计像这样的关键 API 将被严格锁定并且难以篡改。这对我来说是一个有效的假设吗?
我的目标是在我的程序集中提供合理的最佳实践 SSO。如果 Windows 本身受到损害,那是我无法控制的,但如果(例如)与我的程序集链接的应用程序向我提供虚假信息是一件简单的事情,那将是我未能尽职调查的责任。这对我来说是一个很大的无知领域。
需要明确的是,我正在寻找可靠的信息,而不是即兴的意见。因此,发布了漏洞利用程序,或演示了以欺骗我的代码的方式使用 WindowsIdentity
构造函数等。或者在“这是一个有效的假设”方面,可靠的文章支持它,已知的用途依赖在上面,等等。我没有找到它们,但我已经将到目前为止发现的内容包括在下面的分隔符下。
下面是我打算如何使用 WindowsIdentity
:
using System.Security.Principal;
using System.Threading;
// ...
// I only want Windows-authenticated users
WindowsIdentity identity = Thread.CurrentPrincipal == null
? null
: Thread.CurrentPrincipal.Identity as WindowsIdentity;
SecurityIdentifier sid;
// I can't imagine how an authenticated account would be anonymous, but...
if (identity != null && identity.IsAuthenticated && !identity.IsAnonymous) {
// SSO success from thread identity
sid = identity.User;
// ...check that that SID is allowed to use our system...
} else {
identity = WindowsIdentity.GetCurrent();
if (identity != null && identity.IsAuthenticated && !identity.IsAnonymous) {
// SSO success from current Windows user
sid = identity.User;
// ...check that that SID is allowed to use our system...
} else {
// SSO fail
}
}
这是一个 DLL 程序集 - 遗憾的是我们停留在 .Net 3.5 - 为可能受用户权限限制的资源提供公共(public) API。它可能用于桌面应用程序,或用于具有 Windows 身份验证的 ASP.Net IIS 应用程序(ASP.Net 在使用 Windows 时在 Thread.CurrentPrincipal.Identity
上设置一个 WindowsIdentity
实例auth;我们目前不支持其他类型的 IIS 身份验证)。
我是否可以合理地相信来自那些声称已通过身份验证的来源的 WindowsIdentity
实例的 SID?
直到 this question 之前,我都没有想过这是否可以(doh!)用户 lc.引起了人们的担忧,即程序集很容易被与其链接并“伪造”该信息的恶意应用程序所欺骗。不过,他没有任何具体证据可以说明为什么这可能是一个重大问题,因此提出了这个问题。
到目前为止我发现了什么(小):
This answer提出 claim
You can trust that the current
WindowsIdentity
is who it says it is, insofar as you can trust any given piece of data in your application.
这本书 Hacking the Code声称 ASP.Net 要求在进行文件授权检查时将 WindowsIdentity
与请求相关联,如果为真,这似乎是微软至少认为它足够好的一个相当坚实的基础。
我可以找到很多示例,人们在他们的代码中愉快地使用 WindowsIdentity
信息,但他们中的大多数人不会问他们是否安全的问题。有一个暗示,但是......
最佳答案
您不能相信来自 Thread.CurrentPrincipal
的那个,不。没有什么可以阻止以完全信任的方式运行的代码进行欺骗。
我能够像这样在我的环境中欺骗它:
var admin = new WindowsIdentity(@"Administrator");
var princ = new WindowsPrincipal(admin);
System.Threading.Thread.CurrentPrincipal = princ;
...在调用您的代码之前。在我的机器上,创建的 WindowsIdentity
对象的 IsAuthenticated
为 true
和 IsAnonymous
false,所以,当然,您的代码提取我的域管理员的 SID。
这并不适用于所有环境,但只要运行代码有足够的权限使用反射,就应该可以:
var ident = WindowsIdentity.GetCurrent();
Thread.CurrentPrincipal = new WindowsPrincipal(ident);
var userSid = ident.User;
var fakeSid = new SecurityIdentifier("S-1-3-0");
typeof (WindowsIdentity).GetField("m_user",
BindingFlags.Instance | BindingFlags.NonPublic).SetValue(ident, fakeSid);
(同样,在调用您的代码之前完成。)
基本上,没有什么可以阻止同一进程中在完全信任下运行的两段代码相互欺骗。
关于c# - System.Security.Principal.WindowsIdentity 的这种使用是否合理安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33563758/
请帮助我的建议。 我需要通过 xml 文件中的某个变量在我的应用程序上禁用/启用 spring 安全性。 我的 spring-security.xml 文件
我做了很多研究,对我来说一切看起来都是正确的......但我无法让它发挥作用!有人有什么想法吗? 无论我做什么,相关映射仍然对任何人公开(匿名或登录,无论他们具有什么角色)。 理想情况下,我希望所有请
我们正在考虑为我们网站的一部分启用 SSL,但某些页面包含来自第三方供应商(如 Google AdSense)的广告。 我认为这会给我们的用户带来一个恼人的问题,因为他们在查看带有广告的页面时会看到类
我正在开发一个休息服务,它将通过浏览器提供 浏览器单页应用程序和移动应用程序。目前我的服务正在运行 根本没有 Spring 。 oauth2 客户端是在过滤器内部实现的,所以可以说是“手动”。 我正在
我正在为我公司的网站添加 Content-Security-Policy-Report-Only 标题。在我研究它时,我发现一些页面已经设置了 Content-Security-Policy head
在 XML 配置中,我可以使用 security 命名空间来启用对安全性的支持,例如: 我尝试使用没有 XML 的 Spring,只有 @Configuration 类。与上述 XM
我正在使用 Spring Security 3.0.2,但找不到从数据库加载匿名用户角色的方法(我有动态角色,可以将角色分配给每个人)。 我尝试使用自定义的anonymousAuthenticatio
我有那个代码。但是当我在浏览器中进入 app_dev.php/login浏览器说:该页面进行了太多重定向 安全.yml安全: 编码器: Symfony\Component\Security\Core\
我正在使用SSH Secure Shell客户端,这是一个连接服务器的好工具。 但是,我想知道是否可以记录通过SSH Secure Shell客户端运行的程序中所有即将出现的消息。例如:./ test
我有那个代码。但是当我在浏览器中进入 app_dev.php/login浏览器说:该页面进行了太多重定向 安全.yml安全: 编码器: Symfony\Component\Security\Core\
如何为表单例份验证提供程序设置 success_handler(和 failure_handler)? Silex 使用此配置忽略我: register(new Silex\Provider\Secu
新手问题...我已成功实现自定义处理程序和服务(自定义用户详细信息服务、身份验证成功、身份验证失败)并且一切正常。我现在还实现了如果 3 次并发身份验证失败将锁定帐户(一定时间)的功能。 我现在继续处
我正在使用 Spring security java 配置,我想知道一种实现多个 url 注销的方法。即 logout().logoutRequestMatcher(new AntPathReques
我正在为我的 SP 使用 Spring Security SAML 扩展。用户通过 IDP 身份验证后,SP 使用某种方法允许后续调用不必通过 IDP 重新进行身份验证。这是如何在 Spring Se
spring security 有没有办法防止下面的最后一点?我正在使用 3.0.5 - 用户登录我的网站 - 用户转到网站中的任何页面并单击注销 -注销链接使用户 session 无效并将它们发送到
要么我迟到了,要么我做错了什么。我正在使用 Visual Studio 2013,但是我试图使用 Membership 类,using System.Web.Security;我的程序集中不存在命名空
我有一个具有依赖性的oauth2客户端spring-boot应用程序: - Spring 靴1.2.0.RC1 -spring-security-oauth2 2.0.4.RELEASE - Spri
我想在控制台应用程序中生成 HashPasswordForStoringInConfigFile。 它是在 Web 应用程序中使用以下类完成的 System.Web.Security.FormsAut
我需要有多个 PRE_AUTH Spring 安全过滤器。特别是我需要使用 PRE_AUTH除了配置为 PRE_AUTH 的两个过滤器之外的过滤器在 Spring Security 3.0 的 SAM
我猜这里没有答案,但我想知道是否有办法创建这样的自定义注释: @Documented @Inherited @Retention(RetentionPolicy.RUNTIME) @Target({E
我是一名优秀的程序员,十分优秀!