List 8-30 独自の認証をするASPファイル
1: <%
2: Function Base64Decode(src)
3: ' Base64デコードした値を返すプロシージャ
4: xchg = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
5: dest = ""
6:
7: i = 1
8:
9: While i <= Len(src)
10: code = 0
11: For j = 0 To 3
12: c = Instr(1, xchg, Mid(src, i, 1), 0)
13: i = i + 1
14: If c <> 0 Then
15: code = code * (2^6) + (c - 1)
16: Else
17: code = code * (2^(6 *(4 - j)))
18: Exit For
19: End If
20: Next
21:
22: For k = 0 To j - 2
23: dest = dest & Chr((code * 2^(-8*(2 - k))) AND &HFF)
24: Next
25: Wend
26:
27: Base64Decode = dest
28: End Function
29: %>
30:
31: <%
32: ' 認証用のユーザー名とパスワードの一覧
33: ' 本来ならば,テキストファイルやデータベースから引き出すことになる
34: AllowUsers = Array("osawa", "nakamura", "saito")
35: AllowPassword = Array("OwSa", "NKMraa", "say10")
36: %>
37:
38: <%
39: ' 認証をチェックする
40: ' ユーザーからAuthorizationヘッダが送信されてきたかどうかを確認
41: AuthHeader = Request.ServerVariables("HTTP_AUTHORIZATION")
42: If IsEmpty(AuthHeader) Then
43: ' Authorizationヘッダが送信されて来ていない
44: ' 401 Access DeniedとWWW-Authenticateヘッダを送信して,終了する
45: Response.Status = "401 Access Denied"
46: Response.AddHeader "WWW-Authenticate", "BASIC"
47: Response.End
48: End If
49:
50: ' エンコードされたユーザー名とパスワードのペアを取得
51: ' 基本認証の場合,“BASIC エンコードされたユーザー名とパスワード”
52: ' のように空白文字列になっている
53: EncodePass = Split(AuthHeader, " ", -1, 1)
54:
55: ' "BASIC"(大文字小文字の区別なし)から始まらなければ認証方式が
56: ' 違う可能性があるので,エラー扱いとする
57: If StrComp(EncodePass(0), "BASIC", 1) <> 0 Then
58: ' BASICではない
59: Response.Status = "401 Access Denied"
60: Response.AddHeader "WWW-Authenticate", "BASIC"
61: Response.End
62: End If
63:
64: ' Base64エンコードされた文字列を元に戻す
65: DecodePass = Base64Decode(EncodePass(1))
66:
67: ' ユーザー名とパスワードは“:”(コロン)で区切られているので
68: ' それを分離する
69: s = Split(DecodePass, ":", -1, 1)
70: USERNAME = s(0)
71: PASSWORD = s(1)
72:
73: ' ユーザー名とパスワードが合致するかどうかをチェックする
74: MatchFlag = False
75: For i = 0 To UBound(AllowUsers)
76: If USERNAME = AllowUsers(i) AND PASSWORD = AllowPassword(i) Then
77: ' パスワードが合致した
78: MatchFlag = True
79: Exit For
80: End If
81: Next
82: If MatchFlag = False Then
83: ' パスワードが合致しなかった
84: Response.Status = "401 Access Denied"
85: Response.AddHeader "WWW-Authenticate", "BASIC"
86: Response.End
87: End If
88:
89: ' 以上で認証は完了。
90: ' この時点で変数USERNAMEとPASSWORDに
91: ' ユーザーが入力したユーザー名とパスワードがそれぞれ格納されている
92: %>
93:
94: <HTML>
95: <BODY>
96: <H1>認証テスト</H1>
97: 入力されたユーザー名:<%= USERNAME %><BR>
98: 入力されたパスワード:<%= PASSWORD %><BR>
99: </BODY>
100: </HTML>