3

私はActiveX HTTPコントロール用のテストリグを作成しており、確実にPOSTするためのWebサイトを作成する必要があります。物事をシンプルに保つために、私はVSデバッグサーバーでWebアプリケーションを実行しています。 Webアプリケーションプロジェクトは、テストアプリケーションを含むソリューションの一部です。 AXLコントロールはNTLM認証をサポートしていません。 NTLMなしで非常に基本的なHTTP認証を要求するか、ページフォームにリダイレクトする簡単な方法はありますか?投稿時にユーザー名とパスワードを要求するだけです。ユーザー名とパスワードの内容は重要ではないので、すべてが平文として保存されます。VSデバッグサーバで基本的なHTTP認証を実装する方法は?

私はWeb.Configで認証モードを試しました。 WindowsはNTLMと同じに見える(間違っている可能性があります)、Formsにはフォームを使用して接続してクッキーを設定する必要がありますが、Passportはこのプロジェクトの範囲を超えており、どのように実装するのかわかりません。何か案は?

Web.Configで「authentication mode = "Windows" "」を試し、Webアプリケーションの「Web」タブでNTLMチェックボックスをオンにしました。

+0

セキュアなHTTP POSTは安全なGETを最初に必要としますか? – anonWrkrB

+0

オリジナルの投稿に貼り付けることができます。ちょうど編集をクリックして追加してください。あなたが今持っている状態では読むことができません。 – MethodMan

+0

ごめんなさい。一定。 – anonWrkrB

答えて

6

ASP.NETを使用して独自の基本HTTP認証を実装できます。それは非常に複雑な仕様のようなdoesn't seemですが、すべての詳細についてはRFC1945を参照してください。

私はそれをやらなければならない場合は、すべてのリクエストで実行されるHttpModuleから始め、HTTPヘッダーHTTP_AUTHORIZATIONをチェックします。基本認証のヘッダーであれば、ユーザー名とパスワードをデコードできます。ヘッダーが見つからないか、ユーザー名とパスワードが正しくない場合は、HTTP 401応答を返し、WWW-Authenticateヘッダーを追加します。

このような何か(テストしていませんが、あなたのアイデアを得る):

public class BasicAuthenticationModule: IHttpModule 
{ 
    public void Init(HttpApplication application) 
    { 
    application.AuthenticateRequest += new EventHandler(Do_Authentication); 
    } 

    private void Do_Authentication(object sender, EventArgs e) 
    { 
    var request = HttpContext.Current.Request; 
    string header = request.Headers["HTTP_AUTHORIZATION"]; 
    if(header != null && header.StartsWith("Basic ")) 
    { 
     // Header is good, let's check username and password 
     string username = DecodeFromHeader(header, "username"); 
     string password = DecodeFromHeader(header, password); 

     if(Validate(username, password) 
     { 
     // Create a custom IPrincipal object to carry the user's identity 
     HttpContext.Current.User = new BasicPrincipal(username); 
     } 
     else 
     { 
     Protect(); 
     } 
    } 
    else 
    { 
     Protect(); 
    } 
    } 

    private void Protect() 
    { 
    response.StatusCode = 401; 
    response.Headers.Add("WWW-Authenticate", "Basic realm=\"Test\""); 
    response.Write("You must authenticate"); 
    response.End(); 
    } 

    private void DecodeFromHeader() 
    { 
    // Figure this out based on spec 
    // It's basically base 64 decode and split on the : 
    throw new NotImplementedException(); 
    } 

    private bool Validate(string username, string password) 
    { 
    return (username == "foo" && pasword == "bar"); 
    } 

    public void Dispose() {} 

    public class BasicPrincipal : IPrincipal 
    { 
    // Implement simple class to hold the user's identity 
    } 
} 
+0

ありがとう、私は明日それを見ます。 – anonWrkrB

+0

ありがとう、これは私にいくつかの良いアイデアを与えた。私は基本的にちょうどポストからのメインページのヘッダーからユーザー名とパスワードを解析して終了し、期待値と一致しない場合は、ステータスコードを401に設定します。 – anonWrkrB

+0

私はこのスレッドが本当に古いものだと知っていますが、なぜLoginダイアログに値を入力してEnterキーを押したときに何も起こりそうにないのか分かりませんか?このイベントはトリガされず、ユーザの検証は行われません。 – Anto

2

michielvooの答えは素晴らしいですが、全くの簡略化のために、私はページのコードでこれを行ってきました:

string authorization = Request.Headers["Authorization"]; 
string userInfo; 
string username = ""; 
string password = ""; 
if (authorization != null) 
{ 
    byte[] tempConverted = Convert.FromBase64String(authorization.Replace("Basic ", "").Trim()); 
    userInfo = System.Text.Encoding.UTF8.GetString(tempConverted); 
    string[] usernamePassword = userInfo.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries); 
    username = usernamePassword[0]; 
    password = usernamePassword[1]; 
} 

if (username == "yourusername" && password == "yourpassword") 
{ 
} 
else 
{ 
    Response.AddHeader("WWW-Authenticate", "Basic realm=\"Test\""); 
    Response.StatusCode = 401; 
    Response.End(); 
} 
関連する問題