ASP.NET Core'de belirli bir düzen ile yetkilendirme
ASP.NET Core'da kimlik doğrulama düzenleri hakkında ASP.NET Core için bkz. Kimlik doğrulama düzeni.
Tek Sayfalı Uygulamalar (SPA) gibi bazı senaryolarda birden çok kimlik doğrulama yöntemi yaygın olarak kullanılır. Örneğin, uygulama oturum açmak için tabanlı kimlik doğrulaması ve JavaScript istekleri için cookie JWT taşıyıcı kimlik doğrulaması kullanabilir. Bazı durumlarda, uygulama bir kimlik doğrulama işleyicinin birden çok örneğine sahip olabilir. Örneğin, biri temel kimlik içeren ve biri çok faktörlü kimlik doğrulaması (MFA) tetiklendiğinde oluşturulan iki cookie işleyici. Kullanıcı ek güvenlik gerektiren bir işlem gerektirdiği için MFA tetiklenir. Kullanıcı MFA gerektiren bir kaynak isteğinda olduğunda MFA'nın zorlanma hakkında daha fazla bilgi için, MFA ile koruma GitHub sorununa bakın.
Kimlik doğrulama hizmeti kimlik doğrulaması sırasında yapılandırıldığında bir kimlik doğrulama düzeni olarak adlandırılmıştı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/";
});
Önceki kodda iki kimlik doğrulama işleyicisi eklendi: biri s için cookie ve biri taşıyıcı için.
Not
Varsayılan düzenin belirterek HttpContext.User özelliğin bu kimliğe ayarlanmış olması gerekir. Bu davranış istenilmezse, parametresiz biçimiyle bunu devre dışı olduğu gibi devre dışı AddAuthentication bırakabilirsiniz.
Authorize özniteliğiyle düzeni seçme
Yetkilendirme noktasında, uygulama kullanılacak işleyiciyi gösterir. uygulamasına virgülle ayrılmış bir kimlik doğrulama şeması listesi ile uygulamanın yetkilendirecek olduğu işleyiciyi [Authorize] seçin. özniteliği, varsayılan yapılandırmadan bağımsız olarak kullanmak [Authorize] üzere kimlik doğrulama şemasını 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 taşıyıcı işleyicileri çalıştırarak geçerli kullanıcı için bir kimlik oluşturma ve cookie ekleme şansına sahip olur. Yalnızca tek bir düzen belirterek ilgili işleyici çalışır.
[Authorize(AuthenticationSchemes =
JwtBearerDefaults.AuthenticationScheme)]
public class MixedController : Controller
Yukarıdaki kodda yalnızca "Taşıyıcı" şemasına sahip işleyici çalışır. Tüm cookie tabanlı kimlikler yoksayılır.
İlkelerle düzeni seçme
İlkede istenen şemaları belirtmek isterseniz,ilkenizi eklerken AuthenticationSchemes koleksiyonu ayarlayın:
services.AddAuthorization(options =>
{
options.AddPolicy("Over18", policy =>
{
policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
policy.RequireAuthenticatedUser();
policy.Requirements.Add(new MinimumAgeRequirement());
});
});
Önceki örnekte , "Over18" ilkesi yalnızca "Taşıyıcı" işleyicisi tarafından oluşturulan kimliğe karşı çalışır. Özniteliğin özelliğini [Authorize] ayarerek ilkeyi Policy kullanın:
[Authorize(Policy = "Over18")]
public class RegistrationController : Controller
Birden çok kimlik doğrulama şeması kullanma
Bazı uygulamaların birden çok kimlik doğrulaması türü desteklemesi gerekir. Örneğin, uygulamanız kullanıcıların kimliklerini bir Azure Active Directory veritabanından doğrular. Diğer bir örnek de hem şirket içinde hem de B2C'de Active Directory Federasyon Hizmetleri (AD FS) kimlik Azure Active Directory uygulamadır. Bu durumda, uygulama birkaç sayıdan bir JWT taşıyıcı belirteci kabul eder.
Kabul etmek istediğiniz tüm kimlik doğrulama düzenlerini ekleyin. Örneğin, içinde aşağıdaki kod farklı Startup.ConfigureServices sertifikayı gönderenlere iki JWT taşıyıcı kimlik doğrulaması ş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/";
});
}
Not
Varsayılan kimlik doğrulama düzenine yalnızca bir JWT taşıyıcı kimlik doğrulaması JwtBearerDefaults.AuthenticationScheme kaydedilir. Ek kimlik doğrulamasının benzersiz bir kimlik doğrulama düzeniyle kayıtlı olması gerekir.
Sonraki adım, varsayılan yetkilendirme ilkesi her iki kimlik doğrulama düzenini de kabul etmek için güncelleştirilmektedir. Ö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ınarak denetleyicilerde [Authorize] özniteliğini kullanabilirsiniz. Denetleyici daha sonra birinci veya ikinci issuer tarafından verilen JWT'ye sahip istekleri kabul eder.
Birden çok GitHub düzeni kullanmayla ilgili bu soruna bakın.