Tek sayfalı uygulamalarla Güvenli Geliştirme (maça 'Lar)
Bulutta yerel dağıtılmış sistemler geliştirirken, bu tür sistemlerin güvenliğinin sağlanması yeni bir karmaşıklık katmanı ortaya çıkarabilir.
Şirket içi sistemler, iç ağın sağladığı güvenlik sınırlarını kullanır ve Kullanıcı güvenliği için dizin hizmetlerini kullanırlar. Bu güvenli ortamda sorunlar olmadan birçok yıl çalışabilir. Buluta geçmek, yeni güvenlik riskleri sunabilir. Bu makalede, bu riskleri azaltmak için kullanabileceğiniz araçlar açıklanmaktadır.
Bu tür bir araç erişim denetimidir. Access Control kullanıcıları tanımlar ve bir uygulamayla etkileşim kurarken neler yapabileceğini düzenler.
Erişim denetimine iki bölüm vardır:
- Kimlik doğrulaması , kullanıcıyı tanımlar.
- Yetkilendirme , kullanıcının uygulamada neler yapabileceğini belirler.
Açık bir çerçeve olan OAuth, bu güçlüklere yardımcı olur ve geliştiricilerin sistemlerini oluştururken kullanması için bir protokol sağlar. OAuth 2,0, geçerli standarttır.
OAuth 2,0, güvenli temsilci erişimi sağlar. Erişim belirteçleri vererek, kimlik bilgileri sağlamadan, korunan kaynaklarınıza üçüncü taraf erişimini yetkilendirebilirsiniz.
Azure Active Directory (Azure AD), Microsoft 'un buluttaki kimlikleri yönetmek için yerleşik çözümüdür. Şirket içi sistemlerle tümleştirilir, böylece kullanıcılar bulutta Hizmetleri korumaya erişirken sorunsuz bir deneyim yaşar.
Bu kılavuzda, tek sayfalı bir uygulamayı güvenli hale getirmek için Azure AD ve OAuth 2,0 nasıl kullanılacağı gösterilmektedir.
OAuth akışları
OAuth akışları, hepsi Azure AD Hizmetleri tarafından desteklenen birçok kullanım durumunu kapsar. Geliştiriciler, güvenli bir uygulama oluşturmak için bu akışları kullanır, böylece:
- Kullanıcılar, istemci sistemlerine güvenli bir şekilde erişebilir.
- Konuk kullanıcılar, işletmeler arası işlemlere katılabilir.
- Kullanıcılar, Azure Business ile müşterilere (Azure B2C) kadar son tüketicilere ulaşabilir.
İki OAuth akışı, örtük verme ve yetkilendirme kodu vardır. Örtük izin en yaygın bir deyişle, yetkilendirme kodu akışınıkullanmanızı öneririz.
Uygulamanızı Azure 'a kaydetme
Azure portal Azure AD dizinini kullanarak UI ve API için bir hizmet sorumlusu kaydettirin.
Azure Portaloturum açın ve uygulama kayıtlarıaratın.
Yeni kayıtseçeneğini belirleyin.
Yeni bir uygulamayı kaydetmek için şunlar gerekir:
- Uygulamanın görünen adı.
- Desteklenen hesap türü.
- Uygulama türü: Web, SPA veya genel istemci/yerel (mobil ve Masaüstü).
- Yeniden yönlendirme URI 'SI. Kullanıcının kimliği doğrulandığında Azure AD, sonucu istemciye yönlendirir.
- Yerel geliştirme için bir örnek http://localhost:4200.
- Üretim için bir örnek ' https://portal.contoso.com '.
Kaydet’i seçin.
Kayıt tamamlandıktan sonra genel bakış' ı seçin ve ardından yerel dizinde yönetilen uygulama' nın yanındaki uygulama adınızı seçin.
Uygulama için erişim izinlerini ayarlamak üzere Özellikler' i seçin, Kullanıcı atamasını gerekli olarak Evet olarak değiştirin ve ardından Kaydet' i seçin.
Kullanıcılar ve gruplar' ı seçin ve ardından var olan veya yeni kullanıcıları ve güvenlik gruplarını ekleyin.
Kullanıcılarınız uygulamamdauygulama aracılığıyla erişebilir.
İstemci uygulamasında yapılandırma ayrıntılarını ayarlama
Azure 'da uygulama kaydını oluşturup yapılandırdıktan sonra, istemci uygulamasında yapılandırma ayrıntılarını ayarlayabilirsiniz. Angular gibi tek sayfalı bir çerçeve için, Microsoft, istemci uygulamanızda Azure AD 'yi tümleştirmenize yardımcı olmak için @Azure/msal-angular kitaplığını geliştirmiştir.
@Azure/msal-angular kitaplığı 'nı yükler.
Kitaplığı yapılandırın.
- ,
protectedResourceMapBir dizideki korunan kaynakların ve kapsamlarından oluşan bir liste içerir: [[korumalı kaynak], [kaynak için kapsamlar]]. - ,
clientIDauthorityKiracı kimliği olan ve yapılandırma nesnesine sağlanır. - Korumalı HTTP istekleri için, istemci yetkilendirme adlı yeni bir üst bilgi özelliği ekler. Kimliği doğrulanmış kullanıcı için taşıyıcı belirtecini içerir. Taşıyıcı belirteci, aşağı akış OAuth 2,0 hizmetine güvenli bir giriş noktası sağlar. İstek yetkilendirirken hizmetin meta verilerini de içerebilir.
- ,
export const protectedResourceMap: [string, string[]][]] = [
['https://graph.microsoft.com/v1.0/me', ['user.read']],
['https://localhost:5001/api/weatherforecast', ['api://ae05da8f-07d0-4ae6-aef1-18a6af68e5dd/access_as_user']]
];
function MSALConfigFactory(): Configuration {
return {
auth: {
clientId: 'eba23c0b-1e86-4f68-b1d2-9c54d96083de',
authority: 'https://login.microsoftonline.com/1c302616-bc6a-45a6-9c07-838c89d55003',
redirectUri: 'http://localhost:4200',
validateAuthority: true,
postLogoutRedirectUri: 'http://localhost:4200',
navigateToLoginRequestUrl: true
},
cache: {
cacheLocation: 'sessionStorage',
storeAuthStateInCookie: false //set to false, not ie 11
}
};
}
Angular kitaplığı yapılandırma hakkında daha fazla bilgi için bkz. öğretici: kullanıcılar oturum açma ve kimlik doğrulama kod akışı kullanarak bir Angular tek sayfalı uygulamadan (SPA) Microsoft Graph apı 'si çağırma.
Uygulama kimlik doğrulamasını test etme
Bir kullanıcıya erişim izni vererek ve erişim izni olmayan bir kullanıcının istemcide oturum açmaya kalkışarak kimlik doğrulama işlemini test edin.
Kullanıcı uygulamada oturum açar ve Azure AD kiracısına yönlendirilir.
- Kullanıcı geçerliyse, kimlik doğrulaması yapılır ve oturum açar.
- Kullanıcı geçerli değilse, uygulama bir hata döndürür.
Korumalı bir kaynağı veya kaynak sunucusunu kullanma
Korumalı bir kaynağı kullanmak için başka bir uygulama kaydı oluşturun. Uygulama kaydı tamamlandıktan sonra, API, taşıyıcı belirtecini erişime izin verecek şekilde değiştirir.
API 'YI kullanıma sunma
Azure 'da başka bir uygulama kaydı oluşturun.
BIR API 'Yi kullanımasunma ' yı seçin ve ardından Kapsam Ekle' yi seçin.
Uygulama KIMLIĞI URI'sini girin ve ardından Kaydet ve devam et' i seçin. Bu izin, API tarafından isteği doğrulamak için kullanılır.
Kapsam adı ve onay bilgilerini yapılandırın. Yalnızca Yöneticiler' i seçerseniz, Dizin Için yalnızca yöneticiler izin verebilir.
API 'YI uygulama kaydına ekleme
Artık izinlerinizi tanımladığınıza ve API 'yi kullanıma açdığınıza göre, API 'yi istemci için uygulama kaydına eklemeniz gerekir.
Uygulama kaydınız ' nde, API izinleri' ni seçin ve izin ekleyin.
API 'Lerim' i seçin ve ardından oluşturduğunuz API kaydını seçin.
API iznini göstermek için oluşturduğunuz kapsamı seçin ve ardından Izin Ekle' yi seçin.
API artık uygulamaya eklenir. API erişimi için izin vermeyi yeniden sağlamanız gerekebileceğinizden, kullanıcıların reconsent 'e sahip olmaları için yönetici onayı vermeyi göz önünde bulundurun.
Korunan kaynak eşlemesine API ekleme
Azure portal yapılandırma tamamlandığına göre, Kullanıcı arabirimi istemcisi kaynağı kullanabilir. UI 'nin API isteği için doğru taşıyıcı belirtecini iliştirdiğinizden emin olmak için, korumalı kaynak eşlemesine API 'yi ekleyin.
export const protectedResourceMap: [string, string[]][] = [
['https://graph.microsoft.com/v1.0/me', ['user.read']],
['https://localhost:5001/api/weatherforecast', ['api://eba23c0b-1e86-4f68-b1d2-9c54d96083de/access_as_user']]
];
İstemci uygulamanız kaynağa erişmeyi denediğinde, MSAL Istemci kitaplığı bir gizli iframe aracılığıyla Azure AD kimlik doğrulaması yapar ve ardından kaynak için bir taşıyıcı belirteci döndürür. Taşıyıcı belirteci yalnızca uç noktayla eşleşen istekler için eklenir, bu durumda https://localhost:5001/api/weatherforecast.
İlgili uygulama kayıtlarıyla yapılandırdığınız API, geçersiz bir uygulama KIMLIĞI URI 'SI olan bir taşıyıcı belirteci alırsa, isteği reddeder ve 401 Yetkisiz bir ileti döndürür.
Aşağıdaki örnekte, arka uç hizmeti .NET Core 'da yazılmıştır. Örnek, API 'nin yapılandırma özelliklerini gösterir. ClientId, uygulama kimliği URI'sinde şeklindedir. api://{clientId}
"AzureAD": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "yourName.onmicrosoft.com",
"TenantId": "1c302616-bc6a-45a6-9c07-838c89d55003",
"ClientId": "api://ae05da8f-07d0-4ae6-aef1-18a6af68e5dd"
},
.NET Core API'sini başlatma sınıfında, Kimlik doğrulama şeması ve seçenekleri hizmetleri yapılandırma yöntemine eklenir.
services.Addauthentication(AzureADDefaults.BearerAuthenticationScheme).AddAzureADBearer(options => Configuration.Bind("AzureAD",
options));
İstemci API'yi çağıran taşıyıcı belirteci itene eklenir.
Veri kaynağına jwt.ms ve taşıyıcı belirteci insan tarafından okunabilir bir biçime yapıştırabilirsiniz.
API URI'sini özelliğinin içinde olduğunu aud görüyorsunuz. Bu özellik, belirteci hedeflenen alıcıyı (API'niz) tanımlar. API'niz hedeflenen alıcı yoksa, 401 HTTP yanıtıyla isteği otomatik olarak reddeder.
scpözelliği, uygulamanız tarafından ortaya çıkacak kapsamlar kümesi içerir. İstemci aracılığıyla geçersiz kapsamlar eklenirse Azure AD, kapsam için daha fazla yetkilendirme isteği hatası döndürür.
Yetkilendirmeyi daha fazla tanımlamak için uygulama bildirimini kullanma
Daha fazla yetkilendirme uygulamaları, API uygulama kaydı için uygulama bildirimi kullanılarak uygulanır. Açıkça tanımlanmış kullanıcılara sahip olduğunuz için daha fazla yetkilendirme düzeyi ekleyebilir ve yalnızca belirli bir güvenlik grubunun üyelerinin daha hassas kaynaklara erişmesine izin veebilirsiniz.
Uygulama kaydında Bildirim'i seçin.
JSON nesnesinin anahtar değer çiftlerini gereken şekilde düzenleyin.
Genel olarak, yalnızca sorunu en SecurityGroup iyisidir. Allkullanırsanız, güvenlik grupları, Azure AD rolleri ve dağıtım grupları yayımlar. Belirteci 200 olarak ayarlanmış bir sınır vardır ve bu sınıra ulaşıldı ise bir fazlalık talebi eklenir. Talep, kullanıcının Graph almak için bir uç noktayı belirtir.
Yapılandırmadan sonra jwt belirteci, yetkilendirmeyi zorlamak için kullanılan benzersiz nesne kimliklerini içeren groups yeni bir özelliğine sahip olur.
API, ilke işleyicisi aracılığıyla rol tabanlı yetkilendirme için gerekli talebi ve değeri bu ilkeyle yalıtabilirsiniz.
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme).AddAzureADBearer(options => Configuration.Bind("AzureAD",
options));
services.AddAuthorization(options =>
{
options.AddPolicy("DensuAegisReportsAdmin", policyBuilder =>
{
policyBuilder.RequireClaim("groups", "ebde25e7-d254-474e-ae33-cd491aa98ebf"); //This would be an environment variable
});
});
JWTSecurityTokenHandler.DefaultMapInboundClaims = false;
services.AddCors();
services.AddControllers();
}
API denetleyicisinde ilgili asibetler eklenebilir. Bu öznitelikler daha fazla güvenlik sağlar ve kimliği doğrulanmış kişilerin korumalı kaynağa erişim yetkisine sahip olduğunu doğrulamaya yardımcı olur.
[Route("admin")]
[Authorize("DensuAegisReportsAdmin")]
public IActionResult GetForcastsForAdmin()
{
var user = User.Claims;
var groups = User.Claims.Where(c => c.Type == "groups").Select(c => c.Value).ToList();
var userName = UserClaims.Where(c => c.Type == "unique_name").Select(c => c.Value).FirstOrDefault();
// SecurityGroup = groups
var rng = new Random();
var forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)],
})
.ToArray();
return Ok(new
{
User = userName
,
SecurityGroup = groups
,
Forcasts = forecasts
});
}
Uygulama kaydına özgü uygulama bildirimiyle daha fazla rol oluşturulabilir. Daha sonra, uygulama bağlamında daha fazla grup oluşturulabilir.
Örneğin, uygulama kaydına özel olan AppAdmin adlı özel bir rol oluşturabilirsiniz. Kurumsal uygulama derlemeyi kullanarak kullanıcıları veya güvenlik gruplarını bu role atabilirsiniz.
Yapılandırma değişikliğinin ardından korumalı kaynağı çağırarak taşıyıcı belirtecin içinde roles özelliği vardır.
API, Hizmetleri Yapılandır altındaki ilke oluşturucusu kullanılarak yapılandırılır.
// Adding authorization policies that enforce authorization using Azure AD roles.
services.AddAuthorization(options =>
{
options.AddPolicy(AuthorizationPolicies.AssignmentToAppAdminRoleRequired, policy =>
policy.RequireRole(AppRole.AppAdmin));
});
Korumalı yol, kimliği doğrulanmış kullanıcının isteği yetkilendirmeden önce ilgili rolde olduğundan emin olmak için yetkilendirme ilkesi kullanır.
Sonraki adımlar
- Şirket içi AD etki alanlarını Azure AD ile tümleştirme
- Azure Active Directory için kimlik yönetimi ve erişim yönetimi
- Azure sanal ağında AD DS dağıtma