web-dev-qa-db-ja.com

.Net Core Web Apiキー

ユーザーがユーザー名とパスワードで認証できるアプリケーションを開発しており、サーバーで検証されるJWTトークンを提供しています。

追加したいことの1つは、ユーザーがユーザー名とパスワードを使用する代わりに、このアプリケーションと統合するときに使用できる特別なAPIキー(GUID)を持つ機能です。

認証部分が少しブラックボックスのように見えるため(Aspnet Identityを使用)、これを行う方法がわかりません。

以下に、認証セットアップ用の私のコードの一部を示します。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<OmbiContext>(options =>
        options.UseSqlite("Data Source=Ombi.db"));

    services.AddIdentity<OmbiUser, IdentityRole>()
        .AddEntityFrameworkStores<OmbiContext>()
        .AddDefaultTokenProviders();

    services.Configure<IdentityOptions>(options =>
    {
        options.Password.RequireDigit = false;
        options.Password.RequiredLength = 1;
        options.Password.RequireLowercase = false;
        options.Password.RequireNonAlphanumeric = false;
        options.Password.RequireUppercase = false;
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IMemoryCache cache)
{
    var tokenOptions = (IOptions<TokenAuthentication>)app.ApplicationServices.GetService(
        typeof(IOptions<TokenAuthentication>));

    var ctx = (IOmbiContext)app.ApplicationServices.GetService(typeof(IOmbiContext));

    var tokenValidationParameters = new TokenValidationParameters
    {

        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(tokenOptions.Value.SecretKey)),

        RequireExpirationTime = true,
        ValidateLifetime = true,
        ValidAudience = "Ombi",
        ValidIssuer = "Ombi",
        ClockSkew = TimeSpan.Zero
    };

    app.UseJwtBearerAuthentication(new JwtBearerOptions()
    {
        Audience = "Ombi",
        AutomaticAuthenticate = true,
        TokenValidationParameters =  tokenValidationParameters,

    });
 //....
}

上記のコードは、コントローラーで[Authorized]属性を持ち、ロールなどをチェックするときに機能します。

Api-Key属性を渡すために、この特別なAPIキーを含むすべてのリクエストに何らかの[Authorized]ヘッダーを渡す方法はありますか? (キーはDbに保存されます)。

ありがとう

21
Jamie Rees

これは私が最後にしたことです:

 public static void ApiKeyMiddlewear(this IApplicationBuilder app, IServiceProvider serviceProvider)
    {
        app.Use(async (context, next) =>
        {
            if (context.Request.Path.StartsWithSegments(new PathString("/api")))
            {
                // Let's check if this is an API Call
                if (context.Request.Headers["ApiKey"].Any())
                {
                    // validate the supplied API key
                    // Validate it
                    var headerKey = context.Request.Headers["ApiKey"].FirstOrDefault();
                    await ValidateApiKey(serviceProvider, context, next, headerKey);
                }
                else if (context.Request.Query.ContainsKey("apikey"))
                {
                    if (context.Request.Query.TryGetValue("apikey", out var queryKey))
                    {
                        await ValidateApiKey(serviceProvider, context, next, queryKey);
                    }
                }
                else
                {
                    await next();
                }
            }
            else
            {
                await next();
            }
        });
    }

    private static async Task ValidateApiKey(IServiceProvider serviceProvider, HttpContext context, Func<Task> next, string key)
    {
        // validate it here
        var valid = false;
        if (!valid)
        {
            context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            await context.Response.WriteAsync("Invalid API Key");
        }
        else
        {
            var identity = new GenericIdentity("API");
            var principal = new GenericPrincipal(identity, new[] { "Admin", "ApiUser" });
            context.User = principal;
            await next();
        }
    }

元の質問に答えて以来、これはかなり変わっています(Answerはまだ有効です)。しかし、あなたはこれについてここで読むことができます: http://jamietech.com/2019/03/25/net-core-jwt-api-key/

19
Jamie Rees

このリンクのヘッダーリクエストでapiキーを使用することに関する素晴らしい記事があります: http://www.mithunvp.com/write-custom-asp-net-core-middleware-web-api/

要約すると、ASP.NET Coreでは、ミドルウェアを使用してhttpパイプライン構成を制御できます。ミドルウェアは、以前のバージョンのasp.net MVCで使用されていたHttpHandlersを効果的に置き換えます。

1
Mwiza