1

2 つの非常に単純なメソッドを作成しました。

[Authorize]
[HttpGet]
public string getUser()
{
   return User.Identity.Name;
}

[HttpPost]
public bool SignIn(Credentials cred)
{
   var user = userRepository.ValidateUser(cred);
   if (user != null)
   {
      if (user.IsActive)
      {
         FormsAuthentication.SetAuthCookie(userRepository.GetUserIdByEmail(cred.Email).ToString(), cred.RememberMe);
         FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
         user.UserId.ToString(),
         DateTime.UtcNow,
                  DateTime.UtcNow.AddDays(Convert.ToInt32(ConfigurationManager.AppSettings["CookieTimeoutInDays"])),
         true,
         "MyTicket",
         FormsAuthentication.FormsCookiePath);

         //Encrypt the ticket.
         string encTicket = FormsAuthentication.Encrypt(ticket);

         //Create the cookie.
         HttpCookie mycookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);

         // Set the cookie's expiration time to the tickets expiration time
         if (ticket.IsPersistent)
            mycookie.Expires = ticket.Expiration;

         Response.AddHeader(FormsAuthentication.FormsCookieName, encTicket);
         return true;
       }
       else
       return false;
     }
     else
     {
        return false;
     }
  }

これらの関数を API コントローラーと通常のコントローラーに配置しました (異なるのはHttpContext.Current.Response.AddHeader(FormsAuthentication.FormsCookieName, encTicket);、API コントローラーにある場合だけです)。通常のコントローラーで認証し、同じ Cookie を返して呼び出すgetUser()と機能しますが、API コントローラーにそれを行うと機能しません..ブラウザーではなく、モバイル デバイスを使用してこれらのコントローラーの両方を呼び出しています。APIコントローラーは通常、各呼び出しのヘッダーにユーザー名とパスワードを渡すことで基本認証を使用することを理解しましたが、通常のコントローラーから行うと何か問題がありますか? 通常のコントローラーよりも asp.net Web API を使用する利点は何ですか?

4

1 に答える 1

0

通常のコントローラーで認証し、同じ Cookie を返して getUser() を呼び出すと機能しますが、API コントローラーに対して行うと機能しません

なぜそうなのかはわかりません。通常のテンプレートを使用している場合、ApiController は /api ルートの下にあることに注意してください。アクション名は URL の一部ではないことに注意してください。WebApiConfig が次のように言う場合:

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

コントローラー クラスの名前が FooController の場合、ApiController の URL は次のようになります: http://:33504/api/Foo

(GET と POST の両方)。

一般に、Web API で Cookie を使用することは最善の方法ではありませんが、特に必要がある場合は可能です。

つまずく可能性のある場所が他にもいくつかあります。

  1. フォーム認証 Cookie を 2 回生成しています。SetAuthCookie 行は一度それを行い、それを Cookie ヘッダーに入れています。次に、Response.AddHeader が再度それを行い、カスタム ヘッダー (Cookie ヘッダーではありません) に配置します。

  2. Response.AddHeader(FormsCookieName) と言うとき、Response.SetCookie(myCookie) という意味だと思います。現在のコードは、FormsCookieName という名前のカスタム ヘッダーを追加しています。その Cookie 名で Cookie を (Set-Cookie ヘッダーに) 追加するわけではありません。

  3. Web API では、HttpContext.Current.Response の使用は一般的に推奨されません。代わりに、HttpResponseMessage を返し、そのオブジェクトのヘッダー プロパティを設定することを検討してください。

APIコントローラーは通常、各呼び出しのヘッダーにユーザー名とパスワードを渡すことで基本認証を使用することを理解しましたが、通常のコントローラーから行うと何か問題がありますか?

Web API を使用する場合、通常は REST を使用しているため、Cookie はそこにあるハイパーメディアのアイデアとうまく適合しません。ハイパーメディア/REST を使用していない場合は、Cookie を使用できると思いますが、これも通常は最適ではありません。

通常のコントローラーよりも asp.net Web API を使用する利点は何ですか?

Web API は、自己ホスト ストーリーと、コンテンツ ネゴシエーションを実行する機能と優れた HTTP プログラミング モデルを提供します。MVC は特に HTML を中心に設計されました (他のコンテンツ タイプではありません)。HTML を返す場合、MVC はおそらく理にかなっています。アプリで HTML を返すものがない場合は、おそらく Web API の方が適切です。

ただし、この 1 つのコントローラーについては、アプリの残りの部分で行うことはすべて行います。(この 1 つのコントローラーだけに別のフレームワークを選択することはありません。)

于 2013-04-10T22:49:58.150 に答える