【问题标题】:IP check using ASP.NET Forms Authentication使用 ASP.NET 表单身份验证的 IP 检查
【发布时间】:2009-07-22 00:19:53
【问题描述】:

我正在一个 asp.net 网站上实现简单的身份验证。使用基本表单身份验证几乎是完美的:我将身份验证模式设置为 Forms,并在 web.config 中有一个简短的凭据部分,并使用使用 FormsAuthentication.Authenticate() 和 FormsAuthentication.RedirectFromLoginPage() 的简单登录 aspx 页面。

但是,我想为某些客户端 IP 地址添加额外检查。如果请求来自某个 IP 地址,我想自动授权该请求,而不是将该请求重定向到登录页面。有没有一种简单的方法来扩展或覆盖内置表单 AuthenticateRequest?我的另一个选择是创建自己的 HttpModule 来执行此操作,但如果我这样做,我似乎会失去 FormsAuthentication 方法的良好功能以及它们与凭据部分的交互。有什么建议吗?

【问题讨论】:

    标签: asp.net forms-authentication


    【解决方案1】:

    首先,您确定要这样做吗?如果有人能猜出您未验证的 IP 地址范围,那么 IP 欺骗将是攻击您网站的理想方法!即使他们只知道地址范围,这也使得暴力攻击变得微不足道。

    其次,您只需检查登录页面中的 IP 地址并从那里重定向...不需要 HttpModule。但是,同样,如果我是你,我不会这样做。

    更新: R G - 几件事。我的想法是你会在重定向之前做一个 Authenticate() 调用。这将避免重定向循环返回。但看起来你甚至不需要那个,因为......

    其次,根据您在下面的评论(在 Ben 的帖子中),您将在 Web 服务中使用此代码。如果是这种情况,您不能将 Web 服务作为允许访问页面放在 Web.Config 页面中吗?只需添加:

    <location path="YourWebService.asmx">
      <system.web>
        <authorization>
          <allow users="*" />
        </authorization>
      </system.web>
    </location>
    

    这就是我们所做的,尽管我们确实要求我们的网络服务的用户在我们处理网络服务请求之前发送一个“魔法短语”(它也是 SSL 加密的)。

    【讨论】:

    • IP 是额外的检查,而不是唯一的检查。
    • 当然,我知道这会使应用程序容易受到 IP 欺骗,在这种特殊情况下,这不是问题。登录只是一个简单的威慑,但如果有人想通过欺骗的麻烦,我们真的不在乎。关于从登录页面重定向......这并不能解决问题,重定向将再次获得身份验证,将重定向回登录页面等。我需要能够在请求中更早地检查,然后再重定向到登录发生。
    • 马克,感谢您的建议。明确允许访问服务可能是可行的方法。我仍然不确定在登录页面中使用 Authenticate() 或任何其他 FormsAuthentication 辅助方法调用,因为服务的调用者不会接受 cookie,因为它只是另一个发出请求的 Web 服务器。听起来如果我想要完全灵活的身份验证,在它进入登录页面之前,我需要使用我自己的 HttpModule 和那个逻辑。由于这是一个相当简单的方案,所以应该不会太难。
    • R G - 使用单独的 ASMX 页面来处理您的 Web 请求并在 Web.config 中为该页面设置显式权限,您根本不必担心 FormsAuthentication 或登录页面。该服务的用户将直接进入 Web 服务 (ASMX) 页面,绕过登录。此外,这也消除了对 HttpModule 的需要,因为它们不需要任何特殊处理即可访问 ASMX 页面(假设我完全理解您的问题)。
    【解决方案2】:

    我同意马克的观点。

    如果您想让客户在首次验证其凭据(正确地)后非常容易地连接到您的网站,您可以通过修改 web.config 为他们提供一个基本上永久的持久性 cookie:

    <system.web>
        ...
        <authentication mode="Forms">
          <forms timeout="50000000" />
        </authentication>
        ...
    </system.web>
    

    同时调用 RedirectFromLoginPage() 并将 createPersistentCookie 设置为 true

    已编辑警告:如果您这样做(或确实提供任何持续时间的持久性 cookie),还可以通过某种复选框为用户提供拒绝持久性 cookie 的选项。 (最好是反向工作:他们必须检查它以获得持久性 cookie,标题为“单击此以在这台计算机上记住我”或类似名称。)

    【讨论】:

    • 这种方法并不总是有效...一些 machine.configs 将其覆盖为默认值,即 30。相信我,我试图让 cookie 保持活动状态并遇到了这种愚蠢
    • 是的——在一个可能有问题的共享主机环境中。但如果你控制了网络服务器,那就没问题了。
    • 这就是为什么我坚持IP检查,而不经过登录过程,我可能应该早点将其作为原始问题声明。网站需要处理几个 Web 服务调用(除了常规的用户页面请求)。这些 Web 服务调用将来自特定的 IP 范围。它们需要在没有任何身份验证的情况下进行处理。所以我真正的问题是:我能否以某种方式从表单身份验证中排除某些 Web 服务 URL,或者我可以从表单身份验证中排除某些 IP?
    【解决方案3】:

    REMOTE_ADDR 服务器变量将为请求者提供 IP 地址,您可以在允许的地址列表中再次检查它。

    http://msdn.microsoft.com/en-us/library/ms524602.aspx

    此外,您可以将 IIS 配置为仅允许 IIS 管理控制台中的某些 IP 地址并放弃代码,如果您愿意的话。

    【讨论】:

    • 它会给你一个地址,可能属于也可能不属于请求者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2011-11-16
    • 2010-10-27
    相关资源
    最近更新 更多