【发布时间】:2014-02-08 14:48:54
【问题描述】:
我正在尝试创建一个可供外部和内部用户使用的 ASP MVC 4 应用程序,但不确定哪种方法是最好的继续。
我创建了自己的授权逻辑,但这仅处理外部用户,我不确定如何以安全的方式添加和验证内部用户。当前代码如下所示:
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if(Idnt.IsInitialized() == true)
{
return true;
}
else
{
return false;
}
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new RedirectResult("Login/RedirectToExternalLogin");
}
以上对于外部用户来说工作正常。但是我的问题是我们也有一些内部用户。需要访问应用程序的内部用户由 AD 组定义(因此只有部分内部用户被允许访问应用程序)。为了让我检查用户是否在 AD 中,我使用以下代码:
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "MyDomain", "Username", "Password");
问题是我无法在没有用户 AD 用户名和密码的情况下访问域控制器,因此内部用户需要输入此内容,以便我检查用户是否在允许访问应用程序的组中.
我正在考虑创建一个 AdminController 并检查用户是否通过 xyz.com/Admin 或 xyz.com 访问应用程序(并阻止 /Admin 的所有条目从防火墙中的外部访问),但更糟糕的是还可以使用查询字符串 fx 从旧的遗留系统访问应用程序
xyz.com/?VALUE1=1234&VALUE2=5678
不像黑客那样思考/作为安全专家,我的谷歌搜索技能是空的,我有这些问题以确保我不会引入安全风险:
1:最简单的解决方案是创建一个虚拟 AD 帐户,该帐户可以查询 AD 并确定当前登录的 Windows 用户是否是允许访问该应用程序的组的成员。流程基本上是:
- 用户访问应用程序。如果不进行外部验证,请检查用户是否是内部用户和组成员。由于 AD 域控制器与应用程序服务器位于同一域中,这将是一个安全但不是很优雅的解决方案?
2:阻止来自外部源的对 /Admin 的所有访问和所有包含查询字符串的查询(如果这是可能的,或者这会干扰 ASP MVC 的内部魔法工作吗?),然后将(因此验证的)内部用户重定向到输入页面并使用这些凭据来查询 AD 域控制器并验证用户。然而,这也需要以安全的方式存储某种会话变量,所以用户不会一直得到提示,最后我需要验证这个变量或将用户发送到外部登录页面,我不知道伪造这样的东西有多容易?
3:我缺少一个可以帮助我存档上述内容的简单明显的解决方案? Fx 可以像这样检查 IP 地址吗:ASP.Net check if user is internal or external 还是容易欺骗?
【问题讨论】:
-
与论坛网站不同,我们不使用“谢谢”、“感谢任何帮助”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?.
-
检查一下,我以后会拒绝礼貌:)
-
交谈时礼貌 - 但这是问答,而不是交谈。我建议您将我在评论中包含的链接标记为红色。
标签: asp.net asp.net-mvc security asp.net-mvc-4