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
%>