Azure App Service kimlik doğrulamasında kullanıcı kimlikleriyle çalışma

Bu makalede, App Service'de yerleşik kimlik doğrulaması ve yetkilendirmeyi kullanırken kullanıcı kimlikleriyle nasıl çalışabileceğiniz gösterilmektedir.

Uygulama kodunda kullanıcı taleplerine erişme

tüm dil çerçeveleri için App Service gelen belirteçteki talepleri (kimliği doğrulanmış bir son kullanıcıdan veya istemci uygulamasından) istek üst bilgilerine ekleyerek kodunuz için kullanılabilir hale getirir. Dış isteklerin bu üst bilgileri ayarlamasına izin verilmez, bu nedenle yalnızca App Service tarafından ayarlandığında bulunurlar. Bazı örnek üst bilgiler şunlardır:

Üst bilgi Description
X-MS-CLIENT-PRINCIPAL Kullanılabilir taleplerin Base64 kodlanmış JSON gösterimi. Daha fazla bilgi için bkz. İstemci sorumlusu üst bilgisinin kodunu çözme.
X-MS-CLIENT-PRINCIPAL-ID Kimlik sağlayıcısı tarafından ayarlanan çağıranın tanımlayıcısı.
X-MS-CLIENT-PRINCIPAL-NAME Kimlik sağlayıcısı tarafından ayarlanan çağıranın insanlar tarafından okunabilen adı; örneğin, Email Adresi, Kullanıcı Asıl Adı.
X-MS-CLIENT-PRINCIPAL-IDP App Service Kimlik Doğrulaması tarafından kullanılan kimlik sağlayıcısının adı.

Sağlayıcı belirteçleri de benzer üst bilgiler aracılığıyla kullanıma sunulur. Örneğin, Microsoft Kimlik Sağlayıcısı da ve'yi X-MS-TOKEN-AAD-ID-TOKEN uygun şekilde ayarlarX-MS-TOKEN-AAD-ACCESS-TOKEN.

Not

Farklı dil çerçeveleri bu üst bilgileri uygulama koduna küçük harf veya başlık büyük/küçük harf gibi farklı biçimlerde sunabilir.

Herhangi bir dilde veya çerçevede yazılan kod, bu üst bilgilerden ihtiyaç duyduğu bilgileri alabilir. İstemci asıl üst bilgisinin kodunu çözmek bu işlemi kapsar. Bazı çerçeveler için, platform daha kullanışlı olabilecek ek seçenekler de sağlar.

İstemci asıl üst bilgisinin kodunu çözme

X-MS-CLIENT-PRINCIPAL , Base64 kodlanmış JSON olarak kullanılabilir talep kümesinin tamamını içerir. Bu talepler varsayılan talep eşleme işleminden geçer, bu nedenle bazı adları belirteci doğrudan işliyorsanız göreceğiniz adlardan farklı olabilir. Kodu çözülen yük aşağıdaki gibi yapılandırılmıştır:

{
    "auth_typ": "",
    "claims": [
        {
            "typ": "",
            "val": ""
        }
    ],
    "name_typ": "",
    "role_typ": ""
}
Özellik Tür Description
auth_typ dize App Service Kimlik Doğrulaması tarafından kullanılan kimlik sağlayıcısının adı.
claims nesne dizisi Kullanılabilir talepleri temsil eden bir nesne dizisi. Her nesne ve val özellikleri içerirtyp.
typ string Talebin adı. Bu, varsayılan talep eşlemesine tabi olabilir ve belirteçte yer alan karşılık gelen talepten farklı olabilir.
val string Talep değeri.
name_typ string Ad talep türü, tanımlandıysa taleple ilgili name şema bilgilerini sağlayan bir URI'dir.
role_typ string Tanımlandıysa talep hakkında role düzen bilgileri sağlayan bir URI olan rol talep türü.

Bu üst bilgiyi işlemek için uygulamanızın yükün kodunu çözmesi ve ilgilendiğiniz talepleri bulmak için dizide claims yinelemesi gerekir. Bunları uygulamanın dil çerçevesi tarafından kullanılan bir gösterime dönüştürmek kullanışlı olabilir. C# dilinde uygulamanın kullanması için ClaimsPrincipal türü oluşturan bu işlemin bir örneği aşağıda verilmiştir:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Http;

public static class ClaimsPrincipalParser
{
    private class ClientPrincipalClaim
    {
        [JsonPropertyName("typ")]
        public string Type { get; set; }
        [JsonPropertyName("val")]
        public string Value { get; set; }
    }

    private class ClientPrincipal
    {
        [JsonPropertyName("auth_typ")]
        public string IdentityProvider { get; set; }
        [JsonPropertyName("name_typ")]
        public string NameClaimType { get; set; }
        [JsonPropertyName("role_typ")]
        public string RoleClaimType { get; set; }
        [JsonPropertyName("claims")]
        public IEnumerable<ClientPrincipalClaim> Claims { get; set; }
    }

    public static ClaimsPrincipal Parse(HttpRequest req)
    {
        var principal = new ClientPrincipal();

        if (req.Headers.TryGetValue("x-ms-client-principal", out var header))
        {
            var data = header[0];
            var decoded = Convert.FromBase64String(data);
            var json = Encoding.UTF8.GetString(decoded);
            principal = JsonSerializer.Deserialize<ClientPrincipal>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
        }

        /** 
         *  At this point, the code can iterate through `principal.Claims` to
         *  check claims as part of validation. Alternatively, we can convert
         *  it into a standard object with which to perform those checks later
         *  in the request pipeline. That object can also be leveraged for 
         *  associating user data, etc. The rest of this function performs such
         *  a conversion to create a `ClaimsPrincipal` as might be used in 
         *  other .NET code.
         */

        var identity = new ClaimsIdentity(principal.IdentityProvider, principal.NameClaimType, principal.RoleClaimType);
        identity.AddClaims(principal.Claims.Select(c => new Claim(c.Type, c.Value)));
        
        return new ClaimsPrincipal(identity);
    }
}

Çerçeveye özgü alternatifler

ASP.NET 4.6 uygulamaları için, App Service ClaimsPrincipal.Current dosyasını kimliği doğrulanmış kullanıcının talepleri ile doldurur, böylece özniteliği de dahil olmak üzere standart .NET kod desenini [Authorize] izleyebilirsiniz. Benzer şekilde, PHP uygulamaları için App Service değişkeni doldurur_SERVER['REMOTE_USER']. Java uygulamaları için taleplere Tomcat servlet'inden erişilebilir.

Azure İşlevleri için . ClaimsPrincipal.Current NET kodu için doldurulmadığından, istek üst bilgilerinde kullanıcı taleplerini bulabilir veya nesneyi istek bağlamından, hatta bağlama parametresinden alabilirsinizClaimsPrincipal. Daha fazla bilgi için bkz. Azure İşlevleri'da istemci kimlikleriyle çalışma.

.NET Core için Microsoft.Identity.Web, geçerli kullanıcıyı App Service kimlik doğrulamasıyla doldurmayı destekler. Daha fazla bilgi edinmek için Microsoft.Identity.Web wiki'sinde bu konuda bilgi edinebilir veya Microsoft Graph'a erişen bir web uygulaması için bu öğreticide gösterildiğini görebilirsiniz.

Not

Talep eşlemesinin çalışması için Belirteç depoyu etkinleştirmeniz gerekir.

API kullanarak kullanıcı taleplerine erişme

Belirteç deposu uygulamanız için etkinleştirildiyse, çağrısı /.auth/meyaparak kimliği doğrulanmış kullanıcıyla ilgili diğer ayrıntıları da alabilirsiniz.

Sonraki adımlar