-1

* シナリオ: *

C# Visual Studio 2012 で作成した Web API サービス アプリケーションを持っています。この Web サービスには、Web API ヘルプ ページの既定のプロジェクトを含む "Areas" フォルダーがあります。

* 問題: *

必要に応じて、Web Api ヘルプ ページを読み取ることができるユーザーを認証および承認するための手動入力を実装する必要があります。ただし、Web サービスではありません。

これまでのところ、アカウント コントローラーを作成し、プロシージャにログインし、データベースからロールを取得するなどを行ってき
まし。私が持っているglobal.asaxはメインプロジェクトからのもので、Web APIヘルプページには彼自身のものはありません。

* 質問 * Web API ヘルプ ページでのみAuthorization 属性を使用するために、メイン サービスに影響を与えずにApplication_PostAuthenticateRequest
メソッド を記述するにはどうすればよいですか?

よろしくお願いいたします。

4

1 に答える 1

1

あなたの質問を理解したら、承認のみで特定のパスにルーティングしたいですか?

この場合、WebAPI 2 の一部としてルーティングを使用できます。

内にWebAPIConfig.cs次の構成を追加します

public static void Register(HttpConfiguration config)
{
 //Enable attribute routing
 config.MapHttpAttributeRoutes();

//... additional configuraitons
}

次に、API コントローラー内で、デフォルトとは無関係にルートを設定し、必要な属性を追加できます。

[Route("apiname/authroizedLogin")]
[Authorize(Roles="admin")]
public void IHttpActionResult(string username, stringpassword)
{
   try
   {
    dosomething...
    return Ok(somecontext);
   }
   catch(exception e)
   {
    return BadResponse(e.message);
   }
}

これは、WebAPI 2 のルートに関する詳細情報のリンクです。

編集

ロールへのアクセスに関して。実装によって異なります。個人的には、global.asx を使用するのが好きではありません。db 要求がより頻繁に行われるからです。実際の推奨事項を作成するには、実装に関する詳細情報が必要です。ただし、いくつかのオプションがあります。クレーム ベースの認証を使用している場合、ロールはクレームの一部にすることができ、http コンテキスト/リクエストの一部として API に渡されます。ここから、ID を次のように導出できます。

   public long RoleId
    {
        get
        {
            var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
            string id = identity.Claims.Where(c => c.Type == "http://myschema.com/app/claims/roleid")
                .Select(c => c.Value).SingleOrDefault();

            //return 0 if no claim is located
            return (!String.IsNullOrEmpty(id)) ? Convert.ToInt32(id) : 0;
        }
        set
        {
            _userId = value;
        }
    }

クレームを使用していない場合、別のオプションとして、ユーザーが認証されると、暗号化して Cookie として保存できるFormsAuthenticaitonTicketを生成することができます。

于 2015-02-24T14:16:30.133 に答える