web-dev-qa-db-ja.com

ASP.NET Web APIを使用したクロスプラットフォーム認証

ASP.NET Web APIを使用して認証をコーディングし始めると、デスクトップ、モバイル、Webをサポートするためにクロスプラットフォームになりますか?ヘッダーでトークンを使用するなど、RESTful認証を行ういくつかの方法を読みました。

この方法を利用するサンプルプロジェクトはありますか?

質問:

  1. そうでない場合、トークンを読み取るために[Authorize]属性を修正するにはどうすればよいですか?
  2. このトークンを生成するにはどうすればよいですか? Cookieを使用するため、フォーム認証を使用できるとは思わない。
  3. 実際の承認をどのように処理しますか、クライアントは生のパスワードとユーザー名を送信してからトークンを生成しますか、それとも他の方法がありますか?
  4. 私のウェブサイトがそれを使用しているとき、どのように処理しますか?これは、ドメインの取得や承認など、アプリが使用しているときとは異なる方法で処理されると聞きました。
50
Shawn Mclean

トークンは確実な方法だと思います。フォーム認証は、WebのCookieに基づいています。ただし、すべての非ブラウザクライアントにとって、最も理想的な状況ではありません。

私が提案するのは、カスタムAuthorizationFilterAttributeを作成し、OnAuthorizationメソッドをオーバーライドすることです。その方法では、クライアントが有効な資格情報を提供した後、クライアントに発行したトークンの存在を確認できます。この属性は、検証する任意のメソッドまたはコントローラーで使用できます。ここにあなたが参照するかもしれないサンプルがあります

 public class AuthorizeTokenAttribute : AuthorizationFilterAttribute 
{      
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext != null)
        {                
                if (!AuthorizeRequest(actionContext.ControllerContext.Request))
                {
                    actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) { RequestMessage = actionContext.ControllerContext.Request }; 
                }
                return;
        }
    }

    private bool AuthorizeRequest(System.Net.Http.HttpRequestMessage request)
    {
        bool authorized = false;
        if (request.Headers.Contains(Constants.TOKEN_HEADER))
        {               
            var tokenValue = request.Headers.GetValues("TOKEN_HEADER");
            if (tokenValue.Count() == 1) {
                var value = tokenValue.FirstOrDefault();               
               //Token validation logic here
               //set authorized variable accordingly
            }                
        }
        return authorized;
    } }

TOKEN_HEADERは、認証された要求のためにクライアントが返すHTTPヘッダーを表す単なる文字列です。

それでは、それを見てみましょう

  1. クライアントが安全なデータを要求する
  2. クライアントは承認されていません。未承認のステータスコードで応答を返します
  3. クライアントは認証のために資格情報を送信しますが、これはHTTPSで保護する必要があります
  4. 検証されると、クライアントはHTTPヘッダーなどを介してトークンを受け取ります
  5. クライアントは安全なデータのリクエストを再試行しますが、今回はリクエストにトークンを添付しました
  6. AuthorizeTokenAttributeはトークンを検証し、アクションの実行を許可します。

また、John Petersenによるこの投稿を確認してください。 ASP.NET Web APIを安全にする

42
cecilphillip

RESTサービスのユーザーを認証する方法はたくさんあります。トークンを使用することは可能ですが、 Basic Authentication を使用するのはさらに簡単で、標準およびクロスプラットフォームとほぼ同じです。行くことができる。

authorizationauthentication を混同しないでください。 [Authorize]属性はすべて承認に関するものですが、ユーザーが他のメカニズムを使用して認証された後に限ります。最初に適切な認証を行わないと、承認はまったく役に立ちません。

チェックするのに最適なリソースは、 Dominick Baier このテーマの専門家です。

21
Maurice

私は非常に単純なアプローチを使用します。

  1. 一意のaccessIdとaccessKeyでアクセスプロファイルを定義します(例:MD5 hashed GUID value)
  2. そのようなアクセスプロファイルをデータベースに保存する
  3. すべてのリクエスト(GET/POST/etc。)は、accessId、queryHash(MD5ハッシュ値がクエリを表す)、および署名(queryHashのMD5ハッシュ値+ accessKey)を提供する必要があります。もちろん、クライアントはaccessKeyを安全な場所に保管する必要があります!!!
  4. サーバーがリクエストを取得すると、アクセスを拒否または許可するために同じ計算アルゴリズムを使用してaccessIdと署名がチェックされます(認証)
  5. アクセスプロファイルを使用して、リクエストタイプごとに追加の承認を行うことができます。

新しいASP.NET MVC Web APIを使用したこのアプローチのサービスは、ブラウザ/ javascriptおよびネイティブ(デスクトップまたはモバイル)など、あらゆるタイプのクライアントに対応できます。

2
user1344426

UはActionFilterAttributeを使用して、OnActionExecutingメソッドをオーバーライドできます。後でこのフィルターをglobal.csに登録して、Application Startメソッドでこのようなすべてのアクションにこのフィルターを適用します

var config = GlobalConfiguration.Configuration; config.Filters.Add(new CustomAuthAttribute());

{名前空間Customss {パブリッククラスCustomAuthAttribute:ActionFilterAttribute

{

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        // To inforce HTTPS if desired , else comment out the code
        if (!String.Equals(actionContext.Request.RequestUri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
            {
                Content = new StringContent("HTTPS Required")
            };
            return;
        }

       // get toekn from the header

        var userToken = actionContext.Request.Headers.GetValues("UserToken");
         // Customer Logic to check the validity of the token.
        // U can have some DB logic to check , custom STS behind or some loca cache used to compare the values


    }


}

}}

0
Mian