1. ホーム
  2. c#

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

2022-09-29 16:32:11

質問

Webサービスで認証を設定する方法に悩んでいます。 サービスはASP.NET CoreのWeb apiで構築されています。

私のすべてのクライアント(WPFアプリケーション)は、Webサービスの操作を呼び出すために同じ認証情報を使用する必要があります。

いくつかの調査の後、私は基本的な認証 - HTTP リクエストのヘッダーでユーザー名とパスワードを送信する - を思いつきました。 しかし、何時間も調査した結果、ASP.NET Core では基本的な認証ではだめなようです。

私が見つけたリソースのほとんどは、OAuth やその他のミドルウェアを使用して認証を実装しています。しかし、それは、ASP.NET Core の Identity 部分を使用するのと同様に、私のシナリオには特大であるように思われます。

ASP.NET Core Web サービスでユーザー名とパスワードを使用した単純な認証という私の目標を達成するための正しい方法は何でしょうか?

事前にありがとうございます!

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

Basic認証を処理するミドルウェアを実装すればよいでしょう。

public async Task Invoke(HttpContext context)
{
    var authHeader = context.Request.Headers.Get("Authorization");
    if (authHeader != null && authHeader.StartsWith("basic", StringComparison.OrdinalIgnoreCase))
    {
        var token = authHeader.Substring("Basic ".Length).Trim();
        System.Console.WriteLine(token);
        var credentialstring = Encoding.UTF8.GetString(Convert.FromBase64String(token));
        var credentials = credentialstring.Split(':');
        if(credentials[0] == "admin" && credentials[1] == "admin")
        {
            var claims = new[] { new Claim("name", credentials[0]), new Claim(ClaimTypes.Role, "Admin") };
            var identity = new ClaimsIdentity(claims, "Basic");
            context.User = new ClaimsPrincipal(identity);
        }
    }
    else
    {
        context.Response.StatusCode = 401;
        context.Response.Headers.Set("WWW-Authenticate", "Basic realm=\"dotnetthoughts.net\"");
    }
    await _next(context);
}

このコードは、asp.net coreのベータ版で書かれています。お役に立てれば幸いです。