代码之家  ›  专栏  ›  技术社区  ›  Alexandros Marinos

通过IIS在ASP Classic中进行HTTP身份验证(基本或摘要式)(已关闭)

  •  8
  • Alexandros Marinos  · 技术社区  · 17 年前

    我想在ASP Classic中开发一个网站,该网站对脚本控制下的数据库或密码列表使用HTTP身份验证。理想情况下,解决方案不应该涉及组件或IIS设置,因为脚本应该可以在宿主环境中运行。

    对任何线索/代码都深表感激。

    3 回复  |  直到 16 年前
        1
  •  10
  •   lambacck    16 年前

    可以在纯经典的ASP VBScript中进行HTTP基本身份验证。

    您需要一些东西来解码base 64。 Here is a pure VBScript implementation . 您还需要确保在您的IIS配置中,您关闭了“基本身份验证”和“集成Windows身份验证”,因为它们会干扰您在HTTP U授权头中获得的内容。

    下面是一个示例实现,它只是回显用户名和密码。

    <%@LANGUAGE="VBSCRIPT"%>
    
    <!--#include file="decbase64.asp" -->
    
    <%
    Sub Unauth()
        Call Response.AddHeader("WWW-Authenticate", "Basic realm=""SomethingGoesHere""")
        Response.Status = "401 Unauthorized"
        Call Response.End()
    End Sub
    
    Dim strAuth
    strAuth = Request.ServerVariables("HTTP_AUTHORIZATION")
    
    If IsNull(strAuth) Or IsEmpty(strAuth) Or strAuth = "" Then
        Call Unauth
    Else 
        %>
        <html>
        <body>
        <% 
            Dim aParts, aCredentials, strType, strBase64, strPlain, strUser, strPassword
            aParts = Split(strAuth, " ")
            If aParts(0) <> "Basic" Then
                Call Unauth
            End If
            strPlain = Base64Decode(aParts(1))
            aCredentials = Split(strPlain, ":")
        %>
        <%= Server.HTMLEncode(aCredentials(0) & " - " & aCredentials(1)) %>
        </body>
        </html>
        <%
    End If
    %>
    

    把用户名和密码连接到有意义的东西上留给读者作为练习。

        2
  •  3
  •   brianb    17 年前

    根据定义,HTTP身份验证是由Web服务器请求的,我怀疑您是否会找到不会导致没有应用任何IIS设置的解决方案。

    Web浏览器将连接到您的网站,除非您的服务器未经授权使用HTTP响应代码http/1.1 401进行响应,否则浏览将不会传递凭据。

    您可以尝试强制响应代码401并设置头

       WWW-Authenticate: Basic realm="SomethingGoesHere"
    

    然后浏览器将提示用户输入用户名和密码,但将通过明文发送到浏览器(base64编码),如下所示:

    Authorization: Basic YnJpYW5iOmJvYmJ5Ym95
    

    从base64转换为:

    brianb:bobbyboy
    

    我不知道您是否可以从您的ASP页面访问授权头,或者Web服务器是否会因为有人试图在不期望的情况下向其传递凭据而感到异常,但值得一试…

        3
  •  0
  •   littlegeek    17 年前

    嗨,您是要从数据库中获取用户列表还是使用HTTP服务器上的基于网络的权限?

    如果使用的是数据库,请使用ODBC和DSN

    Dim DatabaseObject1
    Set DatabaseObject1 = Server.CreateObject("ADODB.Connection")
    DatabaseObject1.Open("DSN=DSNname;")
    

    如果您想要一个密码对话框(从服务器),您将需要更改IIS设置,以获得一个很好的向导。

    http://www.authenticationtutorial.com/tutorial/