web-dev-qa-db-ja.com

ASP.NetCoreのカスタムベアラートークン認証

これは、カスタムベアラートークン承認メカニズムの許容可能な実装ですか?

認証属性

public class AuthorizeAttribute : TypeFilterAttribute
{
    public AuthorizeAttribute(): base(typeof(AuthorizeActionFilter)){}
}

public class AuthorizeActionFilter : IAsyncActionFilter
{
    private readonly IValidateBearerToken _authToken;
    public AuthorizeActionFilter(IValidateBearerToken authToken)
    {
        _authToken = authToken;
    }

    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        const string AUTHKEY = "authorization";
        var headers = context.HttpContext.Request.Headers;
        if (headers.ContainsKey(AUTHKEY))
        {
            bool isAuthorized = _authToken.Validate(headers[AUTHKEY]);
            if (!isAuthorized)
                context.Result = new UnauthorizedResult();
            else
                await next();
        }
        else
            context.Result = new UnauthorizedResult();
    }
}

検証サービス。APISettingsクラスはappSettingsで使用されますが、検証はデータベースを使用するように拡張できます...明らかに:)

public class APISettings
{
    public string Key { get; set; }
}

public class ValidateBearerToken : IValidateBearerToken
{
    private readonly APISettings _bearer;

    public ValidateBearerToken(IOptions<APISettings> bearer)
    {
        _bearer = bearer.Value;
    }

    public bool Validate(string bearer)
    {
        return (bearer.Equals($"Bearer {_bearer.Key}"));
    }
}

実装

[Produces("application/json")]
[Route("api/my")]
[Authorize]
public class MyController : Controller

appSettings

"APISettings": {
"Key": "372F78BC6B66F3CEAF705FE57A91F369A5BE956692A4DA7DE16CAD71113CF046"

}

リクエストヘッダー

Authorization: Bearer 372F78BC6B66F3CEAF705FE57A91F369A5BE956692A4DA7DE16CAD71113CF046
3

それはうまくいくでしょうが、それは一種の車輪の再発明です。

最近の良いアプローチはJWTを使用することです。詳細については、こちらをご覧ください: http://www.jwt.io/

いくつかの利点は、asp.netコアと非常にうまく統合され、トークンにいくつかの情報(ユーザー名、役割など)を追加できることです。そうすれば、検証のためにデータベースにアクセスする必要さえありません(必要な場合)。

また、キーをappsettingsファイルに保存すると、誤ってソースコードマネージャーにキーが追加される可能性があります(セキュリティ)。ローカル開発にはユーザーシークレットを使用し(またはenvironment = devの場合はキーを無効にし)、本番環境には環境変数を使用できます。

Asp.netでjwtを使用する方法の良い例を次に示します。 https://jonhilton.net/2017/10/11/secure-your-asp.net-core-2.0-api-part-1 -発行-a-jwt /

1
andrecarlucci