Netcore api 3.1'de AuthorizationFilterContext'i okuma


11

API Anahtarlarını kontrol eden özel bir politika uyguladığım çalışan bir netcore 2.2 projem var.

Startup.cs dosyasına bu politikayı şu şekilde ekliyorum

//Add Key Policy
services.AddAuthorization(options =>
{
    options.AddPolicy("AppKey", policy => policy.Requirements.Add(new AppKeyRequirement()));
});

AppKeyRequirement'ımda AuthorizationHandler'den miras alıyorum ve bunun gibi gelen isteklerdeki anahtarları çözüyorum

protected override Task HandleRequirementAsync(AuthorizationHandlerContext authContext, AppKeyRequirement requirement)
{
    var authorizationFilterContext = (AuthorizationFilterContext)authContext.Resource;
    var query = authorizationFilterContext.HttpContext.Request.Query;

    if (query.ContainsKey("key") && query.ContainsKey("app"))
    { // Do stuff

Bu netcore 3.1'de çalışmaz

Aşağıdaki hatayı alıyorum:

'Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext' yazmak için 'Microsoft.AspNetCore.Routing.RouteEndpoint' türündeki nesne kullanılamıyor.

Çekirdek 3 ve üstü için bunu yapmanın doğru yolu nedir?

Kirk Larkin tarafından işaret edildiği gibi, .net 3.0 ve üstü için doğru yol IHttpContextAccessor'u Auth işleyicisine enjekte etmek ve kullanmaktır.

Bu noktada sorum şu, bunu nasıl enjekte ederim? Bunu startup.cs içinde geçiremiyorum ya da en azından nasıl göremiyorum.

Herhangi bir fikir / ipucu çok takdir edilecektir.

Yanıtlar:


17

ASP.NET Core 3.0 öncesi sürümlerde IAuthorizationHandler, MVC boru hattı sırasında uygulamaları çağrıldı. Uç nokta yönlendirmesini (varsayılan olarak) kullanan 3.0 ve sonrasında, bu uygulamalar yetkilendirme ara katmanı ( UseAuthorization()) tarafından çağrılır . Bu ara katman yazılımı , bir parçası olarak değil, MVC ardışık düzeninden önce çalışır .

Bu değişiklik AuthorizationFilterContext, artık yetkilendirme işleyicilerine aktarılmadığı anlamına gelir . Bunun yerine, RouteEndpointöğesine erişim sağlamayan bir örneğidir HttpContext.

Örneğinizde, yalnızca AuthorizationFilterContextele almak için kullanıyorsunuz HttpContext. 3.0 ve sonraki sürümlerde, IHttpContextAccessoryetkilendirme işleyicinize enjekte edin ve bunu kullanın. İşte tamlık için bir örnek:

public class AppKeyAuthorizationHandler : AuthorizationHandler<AppKeyRequirement>
{
    private readonly IHttpContextAccessor httpContextAccessor;

    public AppKeyAuthorizationHandler(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }

    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext authContext, AppKeyRequirement requirement)
    {
        var httpContext = httpContextAccessor.HttpContext;
        var query = httpContext.Request.Query;

        if (query.ContainsKey("key") && query.ContainsKey("app"))
        {
            // ...
        }
    }
}

Ayrıca kayıt gerekebilir IHttpContextAccessoriçinde ConfigureServices:

services.AddHttpContextAccessor();

Kullanım hakkında daha fazla bilgi için bkz . Özel bileşenlerden HttpContext kullanma IHttpContextAccessor.


1
Bu ipucu için teşekkürler. Bir API anahtarı eksikse çağrı reddedilecek bir politika oluşturmaya çalışıyorum. Artık // Anahtar Politika hizmetleri ekle'yi kullanamaz mıyız.AddAuthorization (options => {options.AddPolicy ("AppKey", policy => policy.Requirements.Add (yeni AppKeyRequirement ()));}); Değilse, bir denetleyiciyi bir eylemi gerçekleştirmeden önce nasıl arayabilirim?
w2olves

1
Evet, bu hala eskisi gibi çalışıyor.
Kirk Larkin

Yapıcı IHttpContextAccessor bekliyor Startup.cs ilke oluştururken bunu nasıl geçirebilirim? services.AddAuthorization (options => {options.AddPolicy ("AppKey", policy => policy.Requirements.Add (yeni AppKeyRequirement ()));}); Ayrıca AppKeyAuthorizationHandler için yeni bir varsayılan yapıcı ancak sonra httpContextAccessor.HttpContext oluşturabilir; bir istek geldiğinde null olur. Herhangi bir fikir?
w2olves

1
İşleyicinizi sizin için bir örneği oluşturan ve içindeki DI'yi kullanarak ekleyin IHttpContextAccessor. Belgelere bakın .
Kirk Larkin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.