Aracılığıyla paylaş


Azure Uygulaması Hizmeti kimlik doğrulamasında kullanıcı kimlikleriyle çalışma

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

Uygulama kodunda kullanıcı taleplerine erişme

App Service, tüm dil çerçeveleri için 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 ayarlanmışsa bulunurlar. Bazı örnek üst bilgiler şunlardır:

Üst bilgi Açıklama
X-MS-CLIENT-PRINCIPAL Kullanılabilir taleplerin Base64 kodlanmış JSON gösterimi. Daha fazla bilgi için bkz . İstemci asıl ü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 Arayan için kimlik sağlayıcısı tarafından ayarlanan, örneğin E-posta Adresi, Kullanıcı Asıl Adı gibi okunabilir bir 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 Entra 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ılmış kod, bu üst bilgilerden ihtiyaç duyduğu bilgileri alabilir. İstemci asıl üst bilgisinin kodunun çözülmesi 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örebileceğinizden farklı adlara sahip 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ü Veri Akışı Açıklaması
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 Dize Talebin adı. Bu, varsayılan talep eşlemesine tabi olabilir ve belirteçte yer alan ilgili talepten farklı olabilir.
val Dize Talep değeri.
name_typ Dize Ad talep türü, genellikle bir tane tanımlanmışsa talep hakkında name düzen bilgileri sağlayan bir URI'dir.
role_typ Dize Rol talep türü, genellikle tanımlandığı takdirde talep hakkında role düzen bilgileri sağlayan bir URI'dir.

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

App Service, ASP.NET 4.6 uygulamaları için 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 doldurulmasa da, istek üst bilgilerinde kullanıcı taleplerini bulabilir veya nesneyi istek bağlamından, hatta bağlama parametresi aracılığıyla 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ının App Service kimlik doğrulamasıyla doldurulma işlemini 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'yi 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