web-dev-qa-db-ja.com

ASP.net Web API RESTful Webサービス+基本認証

ASP.Net Web Apiを使用してRESTful Webサービスを実装しています。私は、基本認証+ SSLを使用して認証部分を実行すると結論付けました。それを実装する最良の/正しい方法は何ですか?

私が最初に試みたのは、手動で行い、Authorizationヘッダーを解析し、データベースに対してユーザーをデコードして検証することでした。それは動作しますが、私は何かが欠けているのだろうかと思います。

ユーザーロールとプリンシパルを使用したソリューションを見てきました。これらが実際に何をするのかはわかりませんが、データベースでは自分のユーザーとそのロールを定義しているので、これらが必要になることはほとんどないと思います。

また、まだ完全に理解していないのは、サービスのコンシューマーが各リクエストで資格情報を送信する必要があるか、何らかの方法でキャッシュされているかどうかです。これを実現するために、私のサービスは何かを行う必要がありますか、それとも完全に消費者が処理する必要がありますか?

そして、クライアントがjavascriptでリクエストを行うことに関する最後の質問。サービスを使用しようとする場合、「クロスドメインリクエスト」の問題はありますか?

34
alfoks

Jamie Kurtzeが、ここで基本認証の使用に関する適切な説明を提供しています ASP.NET Web API REST Security Basics

私の理解では、リクエストをステートレスにしたい場合は、各リクエストに認証フィールドを設定する必要があります

Jamie Kurtzeは必要なコードをDelegateHandlerから派生したクラスにラップし、Rick Strahlはフィルターを使用して呼び出しが有効かどうかを確認します。 A WebAPI Basic Authentication Authorization Filter のこのトピックに関する彼のブログ投稿で詳細を読むことができます。

30
2D1C

[BasicHttpAuthorize]属性を適切なコントローラー/メソッドに追加して、初期(サインイン)要求に基本認証を使用します。必要に応じて、属性で sers および Roles を指定します。 BasicHttpAuthorizeAttributeを特殊な AuthorizeAttribute として定義します:

public class BasicHttpAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        if (Thread.CurrentPrincipal.Identity.Name.Length == 0) { // If an identity has not already been established by other means:
            AuthenticationHeaderValue auth = actionContext.Request.Headers.Authorization;
            if (string.Compare(auth.Scheme, "Basic", StringComparison.OrdinalIgnoreCase) == 0) {
                string credentials = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(auth.Parameter));
                int separatorIndex = credentials.IndexOf(':');
                if (separatorIndex >= 0) {
                    string userName = credentials.Substring(0, separatorIndex);
                    string password = credentials.Substring(separatorIndex + 1);
                    if (Membership.ValidateUser(userName, password))
                        Thread.CurrentPrincipal = actionContext.ControllerContext.RequestContext.Principal = new GenericPrincipal(new GenericIdentity(userName, "Basic"), System.Web.Security.Roles.Provider.GetRolesForUser(userName));
                }
            }
        }
        return base.IsAuthorized(actionContext);
    }
}

初期応答にユーザーのAPIキーを含めます。後続の呼び出しにAPIキーを使用します。これにより、ユーザーがユーザー名またはパスワードを変更しても、クライアントの認証は有効なままです。ただし、パスワードを変更するときは、サーバー上のAPIキーを削除して実装する「クライアントの切断」オプションをユーザーに提供します。

24
Edward Brey

優れた基本認証の実装については、こちらをご覧ください

http://leastprivilege.com/2013/04/22/web-api-security-basic-authentication-with-thinktecture-identitymodel-authenticationhandler/

詳細については、以下を参照してください: https://github.com/thinktecture/Thinktecture.IdentityModel.45/wiki

1
leastprivilege