Aracılığıyla paylaş


ASP.NET Core'de belirli bir desenle yetkilendirme

ASP.NET Core'da kimlik doğrulama düzenlerine giriş için bkz . Kimlik doğrulama düzeni.

Tek Sayfalı Uygulamalar (SPA' lar) gibi bazı senaryolarda birden çok kimlik doğrulama yöntemi kullanmak yaygın bir durumdur. Örneğin, uygulama oturum açmak için tabanlı kimlik doğrulaması ve JavaScript istekleri için JWT taşıyıcı kimlik doğrulaması kullanabilir cookie. Bazı durumlarda, uygulamanın birden çok kimlik doğrulama işleyicisi örneği olabilir. Örneğin, biri temel kimlik içeren, diğeri ise çok faktörlü kimlik doğrulaması (MFA) tetiklendiğinde oluşturulan iki cookie işleyici. Kullanıcı ek güvenlik gerektiren bir işlem istediği için MFA tetiklenebilir. Kullanıcı MFA gerektiren bir kaynak istediğinde MFA'yı zorlama hakkında daha fazla bilgi için GitHub sorunu MFA ile koruma bölümüne bakın.

Kimlik doğrulama hizmeti kimlik doğrulaması sırasında yapılandırıldığında bir kimlik doğrulama düzeni adlandırılır. Örnek:

using Microsoft.AspNetCore.Authentication;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication()
        .AddCookie(options =>
        {
            options.LoginPath = "/Account/Unauthorized/";
            options.AccessDeniedPath = "/Account/Forbidden/";
        })
        .AddJwtBearer(options =>
        {
            options.Audience = "http://localhost:5001/";
            options.Authority = "http://localhost:5000/";
        });

builder.Services.AddAuthentication()
        .AddIdentityServerJwt();

builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

app.UseAuthentication();
app.UseIdentityServer();
app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.MapFallbackToFile("index.html");

app.Run();

Yukarıdaki kodda iki kimlik doğrulama işleyicisi eklenmiştir: biri s için cookie, diğeri taşıyıcı için.

Dekont

Varsayılan düzenin belirtilmesi özelliğin HttpContext.User bu kimliğe ayarlanmasına neden olur. Bu davranış istenmiyorsa parametresiz biçimini AddAuthenticationçağırarak devre dışı bırakın.

Authorize özniteliğiyle şemayı seçme

Yetkilendirme noktasında, uygulama kullanılacak işleyiciyi gösterir. Uygulamasına virgülle ayrılmış bir kimlik doğrulama düzenleri listesi geçirerek yetkilendireceği işleyiciyi [Authorize]seçin. özniteliği, [Authorize] varsayılanın yapılandırılıp yapılandırılmadığına bakılmaksızın kullanılacak kimlik doğrulama düzenini veya düzenlerini belirtir. Örnek:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Mvc;

namespace AuthScheme.Controllers;

[Authorize(AuthenticationSchemes = AuthSchemes)]
public class MixedController : Controller
{
    private const string AuthSchemes =
        CookieAuthenticationDefaults.AuthenticationScheme + "," +
        JwtBearerDefaults.AuthenticationScheme;
    public ContentResult Index() => Content(MyWidgets.GetMyContent());

}

Yukarıdaki örnekte, hem hem de cookie taşıyıcı işleyicileri çalışır ve geçerli kullanıcı için bir kimlik oluşturma ve ekleme şansına sahiptir. Yalnızca tek bir düzen belirterek ilgili işleyici şunu çalıştırır:

[Authorize(AuthenticationSchemes=JwtBearerDefaults.AuthenticationScheme)]
public class Mixed2Controller : Controller
{
    public ContentResult Index() => Content(MyWidgets.GetMyContent());
}

Önceki kodda, yalnızca "Taşıyıcı" düzenine sahip işleyici çalışır. Tüm cookietabanlı kimlikler yoksayılır.

İlkelerle düzeni seçme

İlkede istenen düzenleri belirtmeyi tercih ederseniz, ilke eklerken koleksiyonu ayarlayabilirsiniz AuthenticationSchemes :

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("Over18", policy =>
    {
        policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
        policy.RequireAuthenticatedUser();
        policy.Requirements.Add(new MinimumAgeRequirement(18));
    });
});

builder.Services.AddAuthentication()
                .AddIdentityServerJwt();

builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

app.UseAuthentication();
app.UseIdentityServer();
app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.MapFallbackToFile("index.html");

app.Run();

Yukarıdaki örnekte, "Over18" ilkesi yalnızca "Taşıyıcı" işleyicisi tarafından oluşturulan kimliğe karşı çalışır. özniteliğinin Policy özelliğini ayarlayarak ilkeyi [Authorize] kullanın:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace AuthScheme.Controllers;
[Authorize(Policy = "Over18")]
public class RegistrationController : Controller
{
    // Do Registration

Birden çok kimlik doğrulama düzeni kullanma

Bazı uygulamaların birden çok kimlik doğrulaması türünü desteklemesi gerekebilir. Örneğin, uygulamanız Azure Active Directory'den ve bir kullanıcı veritabanından kullanıcıların kimliğini doğrulayabilir. Bir diğer örnek de hem Active Directory Federasyon Hizmetleri (AD FS) hem de Azure Active Directory B2C'den kullanıcıların kimliğini doğrulayan bir uygulamadır. Bu durumda, uygulamanın çeşitli verenlerden bir JWT taşıyıcı belirteci kabul etmesi gerekir.

Kabul etmek istediğiniz tüm kimlik doğrulama düzenlerini ekleyin. Örneğin, aşağıdaki kod farklı verenlerle iki JWT taşıyıcı kimlik doğrulama şeması ekler:

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;

var builder = WebApplication.CreateBuilder(args);

// Authentication
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.Audience = "https://localhost:5000/";
            options.Authority = "https://localhost:5000/identity/";
        })
        .AddJwtBearer("AzureAD", options =>
        {
            options.Audience = "https://localhost:5000/";
            options.Authority = "https://login.microsoftonline.com/eb971100-7f436/";
        });

// Authorization
builder.Services.AddAuthorization(options =>
{
    var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
        JwtBearerDefaults.AuthenticationScheme,
        "AzureAD");
    defaultAuthorizationPolicyBuilder =
        defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
    options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
});

builder.Services.AddAuthentication()
        .AddIdentityServerJwt();

builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

app.UseAuthentication();
app.UseIdentityServer();
app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.MapFallbackToFile("index.html");

app.Run();

Dekont

Varsayılan kimlik doğrulama düzenine JwtBearerDefaults.AuthenticationSchemeyalnızca bir JWT taşıyıcı kimlik doğrulaması kaydedilir. Ek kimlik doğrulamasının benzersiz bir kimlik doğrulama düzeniyle kaydedilmesi gerekir.

Her iki kimlik doğrulama düzenini de kabul etmek için varsayılan yetkilendirme ilkesini güncelleştirin. Örnek:

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;

var builder = WebApplication.CreateBuilder(args);

// Authentication
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.Audience = "https://localhost:5000/";
            options.Authority = "https://localhost:5000/identity/";
        })
        .AddJwtBearer("AzureAD", options =>
        {
            options.Audience = "https://localhost:5000/";
            options.Authority = "https://login.microsoftonline.com/eb971100-7f436/";
        });

// Authorization
builder.Services.AddAuthorization(options =>
{
    var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
        JwtBearerDefaults.AuthenticationScheme,
        "AzureAD");
    defaultAuthorizationPolicyBuilder =
        defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
    options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
});

builder.Services.AddAuthentication()
        .AddIdentityServerJwt();

builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

app.UseAuthentication();
app.UseIdentityServer();
app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.MapFallbackToFile("index.html");

app.Run();

Varsayılan yetkilendirme ilkesi geçersiz kılındıkça, özniteliği denetleyicilerde kullanmak [Authorize] mümkündür. Denetleyici daha sonra birinci veya ikinci veren tarafından verilen JWT ile istekleri kabul eder.

Birden çok kimlik doğrulama şeması kullanmayla ilgili bu GitHub sorununa bakın.

Aşağıdaki örnekte Azure Active Directory B2C ve başka bir Azure Active Directory kiracısı kullanılmaktadır:

using Microsoft.AspNetCore.Authentication;
using Microsoft.IdentityModel.Tokens;
using Microsoft.Net.Http.Headers;
using System.IdentityModel.Tokens.Jwt;

var builder = WebApplication.CreateBuilder(args);

// Authentication
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = "B2C_OR_AAD";
    options.DefaultChallengeScheme = "B2C_OR_AAD";
})
.AddJwtBearer("B2C", jwtOptions =>
{
    jwtOptions.MetadataAddress = "B2C-MetadataAddress";
    jwtOptions.Authority = "B2C-Authority";
    jwtOptions.Audience = "B2C-Audience";
})
.AddJwtBearer("AAD", jwtOptions =>
{
    jwtOptions.MetadataAddress = "AAD-MetadataAddress";
    jwtOptions.Authority = "AAD-Authority";
    jwtOptions.Audience = "AAD-Audience";
    jwtOptions.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateIssuerSigningKey = true,
        ValidAudiences = builder.Configuration.GetSection("ValidAudiences").Get<string[]>(),
        ValidIssuers = builder.Configuration.GetSection("ValidIssuers").Get<string[]>()
    };
})
.AddPolicyScheme("B2C_OR_AAD", "B2C_OR_AAD", options =>
{
    options.ForwardDefaultSelector = context =>
    {
        string authorization = context.Request.Headers[HeaderNames.Authorization];
        if (!string.IsNullOrEmpty(authorization) && authorization.StartsWith("Bearer "))
        {
            var token = authorization.Substring("Bearer ".Length).Trim();
            var jwtHandler = new JwtSecurityTokenHandler();

            return (jwtHandler.CanReadToken(token) && jwtHandler.ReadJwtToken(token).Issuer.Equals("B2C-Authority"))
                ? "B2C" : "AAD";
        }
        return "AAD";
    };
});

builder.Services.AddAuthentication()
        .AddIdentityServerJwt();

builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

app.UseAuthentication();
app.UseIdentityServer();
app.UseAuthorization();

app.MapDefaultControllerRoute().RequireAuthorization();
app.MapRazorPages().RequireAuthorization();

app.MapFallbackToFile("index.html");

app.Run();

Yukarıdaki kodda, ForwardDefaultSelector kimlik doğrulama işleyicilerinin tüm kimlik doğrulama işlemlerini varsayılan olarak adresine iletmesi gereken geçerli istek için varsayılan bir düzen seçmek için kullanılır. Varsayılan iletme mantığı, önce en belirli ForwardAuthenticate, ForwardChallenge, ForwardForbid, ForwardSignInve ForwardSignOut ayarlarını denetler, ardından öğesini ve ardından ForwardDefaultöğesini denetlerForwardDefaultSelector. İlk null olmayan sonuç, iletilecek hedef düzen olarak kullanılır. Daha fazla bilgi için bkz . ASP.NET Core'da ilke düzenleri.

ASP.NET Core'da kimlik doğrulama düzenlerine giriş için bkz . Kimlik doğrulama düzeni.

Tek Sayfalı Uygulamalar (SPA' lar) gibi bazı senaryolarda birden çok kimlik doğrulama yöntemi kullanmak yaygın bir durumdur. Örneğin, uygulama oturum açmak için tabanlı kimlik doğrulaması ve JavaScript istekleri için JWT taşıyıcı kimlik doğrulaması kullanabilir cookie. Bazı durumlarda, uygulamanın birden çok kimlik doğrulama işleyicisi örneği olabilir. Örneğin, biri temel kimlik içeren, diğeri ise çok faktörlü kimlik doğrulaması (MFA) tetiklendiğinde oluşturulan iki cookie işleyici. Kullanıcı ek güvenlik gerektiren bir işlem istediği için MFA tetiklenebilir. Kullanıcı MFA gerektiren bir kaynak istediğinde MFA'yı zorlama hakkında daha fazla bilgi için GitHub sorunu MFA ile koruma bölümüne bakın.

Kimlik doğrulama hizmeti kimlik doğrulaması sırasında yapılandırıldığında bir kimlik doğrulama düzeni adlandırılır. Örnek:

public void ConfigureServices(IServiceCollection services)
{
    // Code omitted for brevity

    services.AddAuthentication()
        .AddCookie(options => {
            options.LoginPath = "/Account/Unauthorized/";
            options.AccessDeniedPath = "/Account/Forbidden/";
        })
        .AddJwtBearer(options => {
            options.Audience = "http://localhost:5001/";
            options.Authority = "http://localhost:5000/";
        });

Yukarıdaki kodda iki kimlik doğrulama işleyicisi eklenmiştir: biri s için cookie, diğeri taşıyıcı için.

Dekont

Varsayılan düzenin belirtilmesi özelliğin HttpContext.User bu kimliğe ayarlanmasına neden olur. Bu davranış istenmiyorsa parametresiz biçimini AddAuthenticationçağırarak devre dışı bırakın.

Authorize özniteliğiyle şemayı seçme

Yetkilendirme noktasında, uygulama kullanılacak işleyiciyi gösterir. Uygulamasına virgülle ayrılmış bir kimlik doğrulama düzenleri listesi geçirerek yetkilendireceği işleyiciyi [Authorize]seçin. özniteliği, [Authorize] varsayılanın yapılandırılıp yapılandırılmadığına bakılmaksızın kullanılacak kimlik doğrulama düzenini veya düzenlerini belirtir. Örnek:

[Authorize(AuthenticationSchemes = AuthSchemes)]
public class MixedController : Controller
    // Requires the following imports:
    // using Microsoft.AspNetCore.Authentication.Cookies;
    // using Microsoft.AspNetCore.Authentication.JwtBearer;
    private const string AuthSchemes =
        CookieAuthenticationDefaults.AuthenticationScheme + "," +
        JwtBearerDefaults.AuthenticationScheme;

Yukarıdaki örnekte, hem hem de cookie taşıyıcı işleyicileri çalışır ve geçerli kullanıcı için bir kimlik oluşturma ve ekleme şansına sahiptir. Yalnızca tek bir düzen belirterek ilgili işleyici çalışır.

[Authorize(AuthenticationSchemes = 
    JwtBearerDefaults.AuthenticationScheme)]
public class MixedController : Controller

Önceki kodda, yalnızca "Taşıyıcı" düzenine sahip işleyici çalışır. Tüm cookietabanlı kimlikler yoksayılır.

İlkelerle düzeni seçme

İlkede istenen düzenleri belirtmeyi tercih ederseniz, ilkenizi eklerken koleksiyonu ayarlayabilirsiniz AuthenticationSchemes :

services.AddAuthorization(options =>
{
    options.AddPolicy("Over18", policy =>
    {
        policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
        policy.RequireAuthenticatedUser();
        policy.Requirements.Add(new MinimumAgeRequirement());
    });
});

Yukarıdaki örnekte, "Over18" ilkesi yalnızca "Taşıyıcı" işleyicisi tarafından oluşturulan kimliğe karşı çalışır. özniteliğinin Policy özelliğini ayarlayarak ilkeyi [Authorize] kullanın:

[Authorize(Policy = "Over18")]
public class RegistrationController : Controller

Birden çok kimlik doğrulama düzeni kullanma

Bazı uygulamaların birden çok kimlik doğrulaması türünü desteklemesi gerekebilir. Örneğin, uygulamanız Azure Active Directory'den ve bir kullanıcı veritabanından kullanıcıların kimliğini doğrulayabilir. Bir diğer örnek de hem Active Directory Federasyon Hizmetleri (AD FS) hem de Azure Active Directory B2C'den kullanıcıların kimliğini doğrulayan bir uygulamadır. Bu durumda, uygulamanın çeşitli verenlerden bir JWT taşıyıcı belirteci kabul etmesi gerekir.

Kabul etmek istediğiniz tüm kimlik doğrulama düzenlerini ekleyin. Örneğin, içindeki Startup.ConfigureServices aşağıdaki kod, farklı verenlerle iki JWT taşıyıcı kimlik doğrulama şeması ekler:

public void ConfigureServices(IServiceCollection services)
{
    // Code omitted for brevity

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.Audience = "https://localhost:5000/";
            options.Authority = "https://localhost:5000/identity/";
        })
        .AddJwtBearer("AzureAD", options =>
        {
            options.Audience = "https://localhost:5000/";
            options.Authority = "https://login.microsoftonline.com/eb971100-6f99-4bdc-8611-1bc8edd7f436/";
        });
}

Dekont

Varsayılan kimlik doğrulama düzenine JwtBearerDefaults.AuthenticationSchemeyalnızca bir JWT taşıyıcı kimlik doğrulaması kaydedilir. Ek kimlik doğrulamasının benzersiz bir kimlik doğrulama düzeniyle kaydedilmesi gerekir.

Sonraki adım, her iki kimlik doğrulama düzenini de kabul etmek için varsayılan yetkilendirme ilkesini güncelleştirmektir. Örnek:

public void ConfigureServices(IServiceCollection services)
{
    // Code omitted for brevity

    services.AddAuthorization(options =>
    {
        var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
            JwtBearerDefaults.AuthenticationScheme,
            "AzureAD");
        defaultAuthorizationPolicyBuilder = 
            defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
        options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
    });
}

Varsayılan yetkilendirme ilkesi geçersiz kılındıkça, özniteliği denetleyicilerde kullanmak [Authorize] mümkündür. Denetleyici daha sonra birinci veya ikinci veren tarafından verilen JWT ile istekleri kabul eder.

Birden çok kimlik doğrulama şeması kullanmayla ilgili bu GitHub sorununa bakın.