web-dev-qa-db-ja.com

WebAPIでの基本認証

私はWebApiの作業を開始しましたが、単純な基本認証を作成したいと思っています。私はそれを行う方法を知りたいですか?

与えられたMSDNリンクで試しましたが、MSDNに段階的なチュートリアルはありません。 http://www.asp.net/web-api/overview/security/basic-authentication

18
Utsav

あなたが与えたリンクはあなたが必要とする詳細の多くを提供します、私はこれが空白を埋めることを望みます。

注:Web.API 2を使用している場合、Microsoftは 認証フィルター を使用した別のアプローチを提案しています。

サーバーにhttpsを設定する

本当のセキュリティが必要な場合、これは非常に重要です。そうしないと、スヌーピングパーティによってパスワードが収集される可能性があります。これをどのように行うかは、セットアップに完全に依存しますが、詳細は説明しませんが、Azure WebRoleで作業している場合は、かなり良いものがあります SSLのセットアップのステップバイステップガイド fromマイクロソフト。

これは次の手順では必要ありませんが、コードをリリースする前に行う必要があります。この部分は通常、他の人(サーバー構成のシステム管理者、証明書を購入するための資金など)を関与させることを含み、多くの警告を与えるのは良いことなので、最初に言及します。

認証を行うためのカスタムIHttpModuleを作成(または盗む)

これはC#コードの大きなブロックです リンク内 -ブラウザから送信された値を解析し、HttpContext.Current.Userを認証されたユーザーに設定します。肉をコピーして独自のアプリケーションのクラスに貼り付けるだけで、後で戻ってきます。コードには、次のusingステートメントが必要です。

_using System; using System.Net.Http.Headers; using System.Security.Principal;
using System.Text; using System.Threading; using System.Web;
_

そのモジュールをアプリケーションに関連付けます

Web.configファイルに新しいモジュールを追加します(system.webServerはおそらくすでに存在していることに注意してください)

_<system.webServer>
  <modules>
    <add name="BasicAuth" type="Full.ClassName.Path.BasicAuth, Assembly.Name"/>
  </modules>
</system.webServer>
_

サイトの関連部分へのアクセスを制限する

アクション定義の前に[Authorize]属性を追加することで、特定のアクションをブロックできます。コントローラクラスの前に追加して、コントローラ全体をブロックします。

_[Authorize] // Restricts access to whole controller    
public class StockController : ApiController {
    [Authorize] // Restricts access to this action - not necessary if whole controller restricted.
    public IEnumerable<StockLevel> Get() {
_

または、App_Start\WebApiConfig.csファイルにconfig.Filters.Add(new AuthorizeAttribute());を追加すると、すべてがロックされます。

注意すべき点-_System.Web.Mvc.AuthorizeAttribute_もあるので、その名前空間が含まれていると、混乱する結果が生じる可能性があります。

この時点で、試してみることができます-user: "user"、pass: "password"。

ユーザー検証をカスタマイズする

リンクから盗んだクラスに戻ると、次のコードブロックが表示されます。

_// TODO: Here is where you would validate the username and password.
private static bool CheckPassword(string username, string password)
_

ユーザー名とパスワードが有効な場合にtrueを返すようにこれを変更します。あなたがあなた自身を転がしているなら、あなたは調査したいかもしれません bcrypt (あなたがネットからダウンロードした実装を信頼しますか?)、 PBKDF2 または 暗号クラス (単純ですが、それほど安全ではありません)が、パスワードを適切に保存することに関して多くの懸念があるため、おそらくMicrosoftからより良いものがあります。

34
Rob Church

これを機能させるには、MSDNの例に数行のコードを追加する必要がありました。具体的には、OnApplicationAuthenticateRequest()で、ユーザーを検証できなかった場合の応答ステータスコードを401に設定しました。

private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)
        {
            var request = HttpContext.Current.Request;
            var authHeader = request.Headers["Authorization"];
            bool validated = false;
            if (authHeader != null)
            {
                var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);

                // RFC 2617 sec 1.2, "scheme" name is case-insensitive
                if (authHeaderVal.Scheme.Equals("basic",
                                                StringComparison.OrdinalIgnoreCase) &&
                    authHeaderVal.Parameter != null)
                {
                    validated = AuthenticateUser(authHeaderVal.Parameter);
                }
            }

            if (!validated)
            {
                HttpContext.Current.Response.StatusCode = 401;
            }
        }

私がそれをしたら、それはうまくいきました。ロジックを構造化するためのより良い方法はおそらくありますが、これは仕事をする例からの最小の変更です。

1
Eric Pohl

コントローラごとまたはメソッドごとに基本認証を選択的に有効にするには、 この質問 で説明されているようにAuthorizeAttributeから導出できます。

1
Edward Brey