1. ホーム
  2. android

[解決済み] ASP.NET Web API 認証

2022-08-17 08:33:57

質問

クライアントアプリケーションからユーザーを認証するために ASP.NET Web API . 私はサイト上のすべてのビデオを見ましたし、また読みました。 このフォーラムの投稿 .

を配置することで [Authorize] 属性を正しく置くと 401 Unauthorized のステータスを返します。しかし、私はユーザーがAPIにログインすることを許可する方法を知る必要があります。

AndroidアプリケーションからAPIにユーザー認証情報を提供し、ユーザーをログインさせ、その後のすべてのAPIコールが事前認証されるようにしたいのですが。

どのように解決するのですか?

ユーザがAPIにログインできるようにする

リクエストと一緒に有効なForms Authentication Cookieを送信する必要があります。このクッキーは通常、認証時にサーバーから送信されます ( LogOn アクション) を呼び出したときに送られます。 [FormsAuthentication.SetAuthCookie メソッドを呼び出すことです ( MSDN ).

つまり、クライアントは2つのステップを実行する必要があるのです。

  1. HTTP リクエストを LogOn アクションにユーザー名とパスワードを送信します。順番に、このアクションは FormsAuthentication.SetAuthCookie メソッドを呼び出し (認証情報が有効な場合)、レスポンスにフォーム認証 Cookie をセットします。
  2. 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.ClientMicrosoft.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"