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.

Yerel bir uygulama ile Web API 'SI arasında güvenli OAuth 2 akışını gösteren diyagram.

İ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.

  1. Azure Portaloturum açın ve uygulama kayıtlarıaratın.

  2. Yeni kayıtseçeneğini belirleyin.

    Yeni kayıt seçiliyken uygulama kayıt sayfasını gösteren ekran görüntüsü.

  3. 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 '.

    Uygulama kaydetme penceresini gösteren ekran görüntüsü.

  4. Kaydet’i seçin.

  5. 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 adının seçili olduğu genel bakış sayfasını gösteren ekran görüntüsü.

  6. 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ı Ataması gerekli olan özellikler sayfasını gösteren ekran görüntüsü.

  7. 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ı/Grup Ekle seçiliyken kullanıcılar ve gruplar sayfasını gösteren ekran görüntüsü.

  8. 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.

  1. @Azure/msal-angular kitaplığı 'nı yükler.

  2. Kitaplığı yapılandırın.

    • , protectedResourceMap Bir dizideki korunan kaynakların ve kapsamlarından oluşan bir liste içerir: [[korumalı kaynak], [kaynak için kapsamlar]].
    • , clientIDauthority Kiracı 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

  1. Azure 'da başka bir uygulama kaydı oluşturun.

  2. BIR API 'Yi kullanımasunma ' yı seçin ve ardından Kapsam Ekle' yi seçin.

    Kapsam Ekle seçili olan bir API 'YI göster sayfasını gösteren ekran görüntüsü.

  3. 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.

    Bir uygulama KIMLIĞI URI 'SI girilmiş ve Kaydet ve devam et seçili olan kapsam Ekle penceresini gösteren ekran görüntüsü.

  4. 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.

    Örnek değerler içeren kapsam yapılandırması Ekle penceresini gösteren ekran görüntüsü.

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.

  1. Uygulama kaydınız ' nde, API izinleri' ni seçin ve izin ekleyin.

    İzin ekle seçili olan API izinleri sayfasını gösteren ekran görüntüsü.

  2. API 'Lerim' i seçin ve ardından oluşturduğunuz API kaydını seçin.

    API 'nin seçili olduğu API 'Lerim sekmesini gösteren ekran görüntüsü.

  3. API iznini göstermek için oluşturduğunuz kapsamı seçin ve ardından Izin Ekle' yi seçin.

    Seçilen kapsamın izin Ekle düğmesi seçili olduğunu gösteren ekran görüntüsü.

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.

Uygulamaya eklenen API 'YI gösteren ekran görüntüsü.

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.

İsteke eklenen taşıyıcı belirteci gösteren ekran görüntüsü.

Veri kaynağına jwt.ms ve taşıyıcı belirteci insan tarafından okunabilir bir biçime yapıştırabilirsiniz.

Taşıyıcı belirteci insan tarafından okunabilir biçimde gösteren ekran görüntüsü.

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.

Jwt.ms dosyasındaki belirteç özelliklerini gösteren ekran görüntüsü.

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.

  1. Uygulama kaydında Bildirim'i seçin.

    Bildirim sayfasını gösteren ekran görüntüsü.

  2. 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.

Bildirime eklenen appRole örneğini gösteren ekran görüntüsü.

Ö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.

Taşıyıcı belirteçte rol özelliğini gösteren ekran görüntüsü.

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