ASP で基本認証をする (unibon)

1999年07月27日: 新規作成(推定)。
2001年06月10日: リトライに関する補足を追加、および、realm の追加。

ASP で HTTP 基本認証します。
VBScript で BASE64 のモジュールを使用しています。
IIS(ASP) の標準では Windows NT のユーザしか認証できませんが、独自に認証することができるので、自前のデータベースになどにユーザ/パスワードリストを構築することができます。
なお、自前で HTML フォームでユーザ名とパスワードを入れさせるのとは異なり、基本認証は HTTP の規約であるため、ブラウザに標準で付属のダイアログが出るのでカッコ良いです。
ここに示したものは基本的な機能だけなので、リトライなどの処理は必要に応じて別途追加が必要でしょう。

2001/06/10 リトライの仕方が一般的なものと違っていたので、修正しました。なお、サンプル中では、ユーザ名が xxx でありパスワードが yyy という固定の文字列と、入力された文字列とを比較するようになっています。
また Netscape 6 では realm の指定が必須のようなので、サンプル中で realm を明示するようにしました。
実際にこのサンプルどおり動いている例は こちら です(新しいウィンドウが開きます。なお都合によりサーバが動いていない時もあります)。

なお、MS からも認証用のモジュールは別途ダウンロードすることもできるらしいです。


<%@Language=VBScript%>
<%Option Explicit%>
<%

' ここに BASE64 の Function 一式を挿入します。

Function auth(ByVal httpauthorization, ByRef username, ByRef password)
    Const One = 1

    If IsEmpty(httpauthorization) Then ' 基本認証のダイアログボックスでキャンセルボタンが押された場合
        username = Null
        password = Null
        auth = False
    Else ' 基本認証のダイアログボックスで OK ボタンが押された場合
        Dim t
        t = Mid(s, 5 + 1 + One)
        Dim d
        d = decode64(t)

        Dim p
        p = Instr(One, d, ":")

        If p >= One Then
            username = Left(d, p - One)
            password = Mid(d, p + 1)
            auth = True
        Else
            username = Null
            password = Null
            auth = False
        End If
    End If
End Function

Dim s
s = Request.ServerVariables("HTTP_AUTHORIZATION")
Dim u
Dim p
Dim b
b = auth(s, u, p)
If b Then ' 基本認証のダイアログボックスで OK ボタンが押された場合
    If u = "xxx" And p = "yyy" Then ' 入力されたユーザ名とパスワードが、登録のものと一致した場合
        Call Response.Write("<HTML><BODY>" & vbNewLine)
        Call Response.Write("username=" & u & ", password=" & p & "<BR>" & vbNewLine)
        Call Response.Write("ようこそ。<BR>" & vbNewLine)
        Call Response.Write("</BODY></HTML>" & vbNewLine)
    Else ' 入力されたユーザ名とパスワードが、登録のものと一致しなかった場合。
        Response.Status = "401 Unauthorized" ' 2001/06/10 認証をリトライするために追加。
        Call Response.AddHeader("WWW-Authenticate", "BASIC realm=""hogehoge""") ' 2001/06/10 認証をリトライするために追加。
        ' 入力を間違えるたびに毎回 response されるが、通常のブラウザでは、3回間違えたときにはじめてこの画面が目に見えるように表示される。
        Call Response.Write("<HTML><BODY>" & vbNewLine)
        Call Response.Write("username=" & u & ", password=" & p & "<BR>" & vbNewLine)
        Call Response.Write("ユーザ名またはパスワードが違います<BR>" & vbNewLine)
        Call Response.Write("</BODY></HTML>" & vbNewLine)
    End If
Else ' 初回のアクセスだった場合、または、基本認証のダイアログボックスでキャンセルボタンが押された場合
    Response.Status = "401 Unauthorized"
    Call Response.AddHeader("WWW-Authenticate", "BASIC realm=""hogehoge""")
    Call Response.Write("<HTML><BODY>" & vbNewLine)
    Call Response.Write("認証できません<BR>" & vbNewLine)
    Call Response.Write("</BODY></HTML>" & vbNewLine)
End If
%>

ASP の目次
ホーム
(このページ自身の絶対的な URL)