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>