2012-03-28 6 views
5

Microsoft ASP.NET MVC 4 ApiControllerを使用して、簡単なRESTful Webサービス(GETのみ)を作成しました。Microsoft MVC 4、APIControllerと適切なRESTfulログインWebサービス

今、私はサービスの認証システムを実装する正しい方法を探しています。 FormsAuthenticationを組み込みにしたくないのは知っています.WSを使っているすべてのアプリケーションに一意のログインページを持たせたくないからです。さらに、RESTfulなパラダイムを壊し、リダイレクトを強制し、クライアントに適切な401ステータスコードを通知しません。

だから私は私のweb.configから次の行を削除無効FormsAuthenticationを持っている:

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 

と、次の追加:

<modules runAllManagedModulesForAllRequests="true"> 
    <remove name="FormsAuthentication" /> 
</modules> 

を私はすでに、ユーザーのログインを管理するためのApiControllerを持って、その基本的にチェック資格は自分のデータベースに対して返され、ユーザーが返されます。資格情報が有効でない場合は401が返されます。

MembershipAuthorization APIを実装する必要があることを読んだことがありますが、最初からやり直すのに役立つものは何も見つかりませんでした。 アイデアはありますか?データベース上でクッキーや認証コードを管理する必要がありますか、それとも私のためにはFormsAuthenticationと同じクラスですか?

答えて

3

私は解決策を見つけました。私は基本的にMicrosoftによってexampleに示された回避策を使用しました。

  1. App_Startという名前のフォルダを作成します。
  2. twoclassesを適切な名前空間に置きます。
  3. FormsAuthenticationと追加された要求/応答処理システムが残りの処理を行います。

私は401応答では "コンテンツはここに移動" 好きではなかったので、私はOnEndRequest方法をこのように編集しました:

private void OnEndRequest(object source, EventArgs args) 
    { 
     var context = (HttpApplication)source; 
     var response = context.Response; 

     if (context.Context.Items.Contains("__WEBAPI:Authentication-Fixup")) 
     { 
      response.StatusCode = (int)context.Context.Items[FixupKey]; 
      response.RedirectLocation = null; 
      // Clear the page content, since I don't want the "Content moved here." body 
      response.ClearContent(); 
     } 
    } 

参考文献:

2

これをチェックアウトするproject on github。 ASP.NET Web APIにセキュリティを追加するための例がいくつか用意されています。サポートされているセキュリティモデルの1つは基本認証です。これはあなたの質問に記述されているようです。

+0

最初の例、BasicAuthenticationが必要です。しかし、私は、authcodeを格納する方法があるかどうかはまだ理解していません(authcodeとしてクライアントにユーザー名とパスワードを送信しません)。 – frapontillo

+0

「authcodeを保存する方法」という意味を理解しているかどうかはわかりません。 authcodeについてのあなたの説明は何ですか?基本認証では、送信されたユーザー名/パスワードをエンコードし、もう一方の端でデコードします。基本認証でHTTPS/SSL/TSLを使用して、電文全体のメッセージを暗号化することもできます。 DBにパスワードを格納するとき、私は常に格納されたパスワードの一方向の暗号化を使用します。次に、DB内の内容を比較する前に、ユーザーが入力したパスワードに対して同じ暗号化を使用します。 –

+0

ログインごとに一時的な認証コードを作成し、データベースに格納したいと考えています。これはFormsAuthenticationと同じことだと思います。ログインしたユーザーに厳密にリンクされたセッション認証コードを作成します。 – frapontillo

関連する問題