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 |
Kimlik sağlayıcısı tarafından ayarlanan arayan için e-posta adresi veya 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 bir 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ı. 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
yineleme yapması 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.
API'yi kullanarak kullanıcı taleplerine erişme
Belirteç deposu uygulamanız için etkinleştirildiyse, çağrısı /.auth/me
yaparak kimliği doğrulanmış kullanıcıyla ilgili diğer ayrıntıları da alabilirsiniz.