[解決済み] ASP.NET Web API 認証
質問
クライアントアプリケーションからユーザーを認証するために ASP.NET Web API . 私はサイト上のすべてのビデオを見ましたし、また読みました。 このフォーラムの投稿 .
を配置することで
[Authorize]
属性を正しく置くと
401 Unauthorized
のステータスを返します。しかし、私はユーザーがAPIにログインすることを許可する方法を知る必要があります。
AndroidアプリケーションからAPIにユーザー認証情報を提供し、ユーザーをログインさせ、その後のすべてのAPIコールが事前認証されるようにしたいのですが。
どのように解決するのですか?
ユーザがAPIにログインできるようにする
リクエストと一緒に有効なForms Authentication Cookieを送信する必要があります。このクッキーは通常、認証時にサーバーから送信されます (
LogOn
アクション) を呼び出したときに送られます。
[FormsAuthentication.SetAuthCookie
メソッドを呼び出すことです (
MSDN
).
つまり、クライアントは2つのステップを実行する必要があるのです。
-
HTTP リクエストを
LogOn
アクションにユーザー名とパスワードを送信します。順番に、このアクションはFormsAuthentication.SetAuthCookie
メソッドを呼び出し (認証情報が有効な場合)、レスポンスにフォーム認証 Cookie をセットします。 -
HTTP リクエストを
[Authorize]
保護されたアクションに、最初のリクエストで取得したフォーム認証クッキーを一緒に送信します。
例を見てみましょう。Webアプリケーションに2つのAPIコントローラが定義されているとします。
最初のものは、認証処理を担当します。
public class AccountController : ApiController
{
public bool Post(LogOnModel model)
{
if (model.Username == "john" && model.Password == "secret")
{
FormsAuthentication.SetAuthCookie(model.Username, false);
return true;
}
return false;
}
}
と、許可されたユーザーのみが見ることができる保護されたアクションを含む2つ目のアクションがあります。
[Authorize]
public class UsersController : ApiController
{
public string Get()
{
return "This is a top secret material that only authorized users can see";
}
}
さて、このAPIを消費するクライアントアプリケーションを書くことができました。ここでは、簡単なコンソールアプリケーションの例を示します。
Microsoft.AspNet.WebApi.Client
と
Microsoft.Net.Http
NuGet パッケージ)。
using System;
using System.Net.Http;
using System.Threading;
class Program
{
static void Main()
{
using (var httpClient = new HttpClient())
{
var response = httpClient.PostAsJsonAsync(
"http://localhost:26845/api/account",
new { username = "john", password = "secret" },
CancellationToken.None
).Result;
response.EnsureSuccessStatusCode();
bool success = response.Content.ReadAsAsync<bool>().Result;
if (success)
{
var secret = httpClient.GetStringAsync("http://localhost:26845/api/users");
Console.WriteLine(secret.Result);
}
else
{
Console.WriteLine("Sorry you provided wrong credentials");
}
}
}
}
そして、2つのHTTPリクエストは以下のように表示されます。
認証のリクエストです。
POST /api/account HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: localhost:26845
Content-Length: 39
Connection: Keep-Alive
{"username":"john","password":"secret"}
認証の応答です。
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 13 Jun 2012 13:24:41 GMT
X-AspNet-Version: 4.0.30319
Set-Cookie: .ASPXAUTH=REMOVED FOR BREVITY; path=/; HttpOnly
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 4
Connection: Close
true
保護されたデータのリクエストです。
GET /api/users HTTP/1.1
Host: localhost:26845
Cookie: .ASPXAUTH=REMOVED FOR BREVITY
保護されたデータに対する応答です。
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 13 Jun 2012 13:24:41 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 66
Connection: Close
"This is a top secret material that only authorized users can see"
関連
-
[解決済み] Chromeを使用してASP.NET Web APIがXMLの代わりにJSONを返すようにするにはどうすればよいですか?
-
[解決済み] Gitのプッシュで "Authentication Failed "と表示される
-
[解決済み] ASP.NET WebサイトとASP.NET Webアプリケーションのどちらを選ぶか?
-
[解決済み】RESTful 認証
-
[解決済み】ASP.NET Web APIのJWT認証について
-
[解決済み】認証や認可に失敗した場合、AuthorizeAttributeがログインページにリダイレクトされるのはなぜですか?
-
[解決済み] ASP.NET Web APIでのユーザー認証
-
[解決済み] handler.postDelayed()を停止する。
-
[解決済み] アンドロイドのクライアントでヒープアップデートを有効にする方法
-
[解決済み] EditTextの右側のDrawableにonClickListenerを設定する [重複] [重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Nexus 4でUSBデバッグモードを見つける方法とオンにする方法
-
[解決済み] Android - タイトルバーに戻るボタンが表示される
-
[解決済み] Androidのソースコードにある@hideの意味とは?
-
[解決済み] 「KotlinとAndroidで「パラメータTを推測するのに十分な情報がありません。
-
[解決済み] AppCompat-v7 21でアクションバー/ツールバーにアイコンを表示する。
-
[解決済み] wrap_contentでRelativeLayoutがフルスクリーンになってしまう
-
[解決済み] ArrayList<MyCustomClass>をJSONArrayに変換する。
-
[解決済み] Android: xml リソースからの整数値
-
[解決済み] Travis.yml ./gradlew : パーミッションが拒否されました。
-
[解決済み] Google Play ストア内部テストのロールアウトが開始できない