Kurumsal uygulamalar için JSON web belirtecinde (JWT) verilen talepleri özelleştirme
Microsoft kimlik platformu, Microsoft Entra uygulama galerisindeki ve özel uygulamalardaki en önceden tümlenmiş uygulamalarla çoklu oturum açmayı (SSO) destekler. Bir kullanıcı OIDC protokolunu kullanarak Microsoft kimlik platformu aracılığıyla bir uygulamada kimlik doğrulaması yaparsa, Microsoft kimlik platformu uygulamaya bir belirteç gönderir. Uygulama, kullanıcı adı ve parola isteme yerine oturum açmak için belirteci doğrular ve kullanır.
OIDC ve OAuth uygulamaları tarafından kullanılan bu JSON Web belirteçleri (JWT), kullanıcı hakkında talep olarak bilinen bilgiler içerir. Talep, kimlik sağlayıcısının bu kullanıcı için verdikleri belirtecin içindeki bir kullanıcı hakkında belirttiği bilgilerdir. OIDC yanıtında talep verileri genellikle kimlik sağlayıcısı tarafından JWT biçiminde verilen Kimlik Belirtecinde yer alır.
Talepleri görüntüleme veya düzenleme
İpucu
Bu makaledeki adımlar, başladığınız portala göre biraz değişiklik gösterebilir.
JWT'de uygulamaya verilen talepleri görüntülemek veya düzenlemek için:
- Microsoft Entra yönetim merkezinde en az Bulut Uygulaması Yönetici istrator olarak oturum açın.
- Kimlik>Uygulamaları>Kurumsal uygulamaları>Tüm uygulamalar'a göz atın.
- Uygulamayı seçin, sol taraftaki menüden Çoklu oturum açma'yı ve ardından Öznitelikler ve Talepler bölümünde Düzenle'yiseçin.
Bir uygulamanın çeşitli nedenlerle talep özelleştirmesi gerekebilir. Örneğin, bir uygulama farklı bir talep URI'leri veya talep değerleri kümesi gerektirdiğinde. Öznitelikler ve Talepler bölümünü kullanarak, uygulamanız için bir talep ekleyebilir veya kaldırabilirsiniz. Ayrıca, kullanım örneğine göre bir uygulamaya özgü bir özel talep de oluşturabilirsiniz.
Aşağıdaki adımlarda sabit bir değerin nasıl atandığı açıklanmaktadır:
- Değiştirmek istediğiniz talebi seçin.
- Kaynak özniteliğinde, kuruluşunuza göre tırnak işaretleri olmadan sabit değeri girin ve Kaydet'i seçin.
Özniteliklere genel bakış, sabit değeri görüntüler.
Özel talep dönüştürmeleri
Aşağıdaki özel talep dönüştürme işlevlerini kullanabilirsiniz.
İşlev | Açıklama |
---|---|
ExtractMailPrefix() | E-posta adresinden veya kullanıcı asıl adından etki alanı sonekini kaldırır. Bu işlev, kullanıcı adının yalnızca ilk bölümünü ayıklar. Örneğin, joe_smith yerine joe_smith@contoso.com . |
ToLower() | Seçili özniteliğin karakterlerini küçük harflere dönüştürür. |
ToUpper() | Seçili özniteliğin karakterlerini büyük harf karakterlere dönüştürür. |
Uygulamaya özgü talepler ekleme
Uygulamaya özgü talepler eklemek için:
- Kullanıcı Öznitelikleri ve Talepler bölümünde Yeni talep ekle'yi seçerek Kullanıcı taleplerini yönet sayfasını açın.
- Taleplerin adını girin. Değerin kesinlikle bir URI desenini izlemesi gerekmez. URI deseni gerekiyorsa, bunu Ad Alanı alanına yerleştirebilirsiniz.
- Talebin değerini alacağı Kaynağı seçin. Kaynak öznitelik açılan listesinden bir kullanıcı özniteliği seçebilir veya bunu talep olarak yaymadan önce kullanıcı özniteliğine dönüştürme uygulayabilirsiniz.
Talep dönüştürmeleri
Kullanıcı özniteliğine dönüştürme uygulamak için:
- Talebi yönet bölümünde, Dönüştürmeyi yönet sayfasını açmak için talep kaynağı olarak Dönüştürme'yi seçin.
- Dönüştürme açılan listesinden işlevi seçin. Seçilen işleve bağlı olarak, dönüştürmede değerlendirilecek parametreleri ve sabit bir değeri sağlayın.
- Kaynağı birden çok değerli olarak kabul etmek, dönüşümün tüm değerlere mi yoksa yalnızca ilk değere mi uygulandığını gösterir. Varsayılan olarak, çok değerli bir talepteki ilk öğe dönüştürmeleri uygulanır. Bu kutuyu işaretlediğinizde, tümüne uygulanmasını sağlar. Bu onay kutusu yalnızca çok değerli öznitelikler için etkinleştirilir. Örneğin,
user.proxyaddresses
. - Birden çok dönüştürme uygulamak için Dönüştürme ekle'yi seçin. Bir talepe en fazla iki dönüştürme uygulayabilirsiniz. Örneğin, önce öğesinin e-posta ön ekini
user.mail
ayıklayabilirsiniz. Ardından dizeyi büyük harf yapın.
Talepleri dönüştürmek için aşağıdaki işlevleri kullanabilirsiniz.
İşlev | Açıklama |
---|---|
ExtractMailPrefix() | E-posta adresinden veya kullanıcı asıl adından etki alanı sonekini kaldırır. Bu işlev, kullanıcı adının yalnızca ilk bölümünü ayıklar. Örneğin, joe_smith yerine joe_smith@contoso.com . |
Join() | İki özniteliği birleştirerek yeni bir değer oluşturur. İsteğe bağlı olarak, iki öznitelik arasında bir ayırıcı kullanabilirsiniz. NameID talep dönüşümü için Join() işlevi, dönüştürme girişinin bir etki alanı parçası olduğunda belirli bir davranışa sahiptir. Etki alanı bölümünü ayırıcı ve seçili parametreyle birleştirmeden önce girdiden kaldırır. Örneğin, dönüşümün joe_smith@contoso.com girişi, ayırıcı @ ise ve parametresi ise fabrikam.com , bu giriş bileşimi ile joe_smith@fabrikam.com sonuçlanır. |
ToLowercase() | Seçili özniteliğin karakterlerini küçük harflere dönüştürür. |
ToUppercase() | Seçili özniteliğin karakterlerini büyük harf karakterlere dönüştürür. |
Contains() | Giriş belirtilen değerle eşleşiyorsa bir öznitelik veya sabit verir. Aksi takdirde, eşleşme yoksa başka bir çıkış belirtebilirsiniz. Örneğin, etki alanını @contoso.com içeriyorsa değerin kullanıcının e-posta adresi olduğu bir talep yaymak istiyorsanız, aksi takdirde kullanıcı asıl adını çıkarmak istersiniz. Bu işlevi gerçekleştirmek için aşağıdaki değerleri yapılandırabilirsiniz:Parametre 1(giriş): user.email Değer: "@contoso.com" Parametre 2 (çıkış): user.email Parametre 3 (eşleşme yoksa çıkış): user.userprincipalname |
EndWith() | Girişin belirtilen değerle bitmesi durumunda bir öznitelik veya sabit çıkışı verir. Aksi takdirde, eşleşme yoksa başka bir çıkış belirtebilirsiniz. Örneğin, çalışan kimliği ile 000 bitiyorsa değerin kullanıcının çalışan kimliği olduğu bir talep yaymak istiyorsanız, aksi takdirde bir uzantı özniteliği çıkarmak istersiniz. Bu işlevi gerçekleştirmek için aşağıdaki değerleri yapılandırabilirsiniz:Parametre 1(giriş): user.employeeid Değer: "000" Parametre 2 (çıkış): user.employeeid Parametre 3 (eşleşme yoksa çıkış): user.extensionattribute1 |
StartWith() | Giriş belirtilen değerle başlıyorsa bir öznitelik veya sabit verir. Aksi takdirde, eşleşme yoksa başka bir çıkış belirtebilirsiniz. Örneğin, ülke/bölge ile US başlıyorsa, değerin kullanıcının çalışan kimliği olduğu bir talep yaymak istiyorsanız, aksi takdirde bir uzantı özniteliği çıkarmak istersiniz. Bu işlevi gerçekleştirmek için aşağıdaki değerleri yapılandırabilirsiniz:Parametre 1(giriş): user.country Değer: "US" Parametre 2 (çıkış): user.employeeid Parametre 3 (eşleşme yoksa çıkış): user.extensionattribute1 |
Extract() - Eşleştirmeden sonra | Belirtilen değerle eşleşdikten sonra alt dizeyi döndürür. Örneğin, girişin değeri Finance_BSimon ise eşleşen değer olur Finance_ ve talebin çıktısı olur BSimon . |
Extract() - Eşleştirmeden önce | Belirtilen değerle eşleşene kadar alt dizeyi döndürür. Örneğin, girişin değeri BSimon_US ise eşleşen değer olur _US ve talebin çıktısı olur BSimon . |
Extract() - Eşleştirme arasında | Belirtilen değerle eşleşene kadar alt dizeyi döndürür. Örneğin, girişin değeri ise Finance_BSimon_US , ilk eşleşen değer , Finance_ ikinci eşleşen değer ise _US , talebin çıktısı olur BSimon . |
ExtractAlpha() - Ön Ek | Dizenin alfabetik ön ek bölümünü döndürür. Örneğin, girişin değeri ise BSimon_123 döndürür BSimon . |
ExtractAlpha() - Sonek | Dizenin alfabetik bölümünü döndürür. Örneğin, girişin değeri ise 123_Simon döndürür Simon . |
ExtractNumeric() - Ön Ek | Dizenin sayısal bölümünün ön ekini döndürür. Örneğin, girişin değeri ise 123_BSimon döndürür 123 . |
ExtractNumeric() - Sonek | Dizenin sonek sayısal bölümünü döndürür. Örneğin, girişin değeri ise BSimon_123 döndürür 123 . |
IfEmpty() | Giriş null veya boşsa bir öznitelik veya sabit oluşturur. Örneğin, belirli bir kullanıcının çalışan kimliği boşsa uzantı özniteliğinde depolanan bir özniteliğin çıktısını almak istiyorsanız. Bu işlevi gerçekleştirmek için aşağıdaki değerleri yapılandırın: Parametre 1(giriş): user.employeeid Parametre 2 (çıkış): user.extensionattribute1 Parametre 3 (eşleşme yoksa çıkış): user.employeeid |
IfNotEmpty() | Giriş null veya boş değilse bir öznitelik veya sabit çıkışı oluşturur. Örneğin, belirli bir kullanıcının çalışan kimliği boş değilse uzantı özniteliğinde depolanan bir özniteliğin çıktısını almak istiyorsanız. Bu işlevi gerçekleştirmek için aşağıdaki değerleri yapılandırabilirsiniz: Parametre 1(giriş): user.employeeid Parametre 2 (çıkış): user.extensionattribute1 |
Substring() - Sabit Uzunluk | Dize talep türünün belirtilen konumdaki karakterden başlayarak bölümlerini ayıklar ve belirtilen karakter sayısını döndürür. SourceClaim - Yürütülmesi gereken dönüşümün talep kaynağı. StartIndex - Bu örnekteki bir alt dizenin sıfır tabanlı başlangıç karakteri konumu. Uzunluk - Alt dizenin karakter cinsinden uzunluğu. Örneğin: sourceClaim - PleaseExtractThisNow StartIndex - 6 Uzunluk - 11 Çıkış: ExtractThis |
Substring() - EndOfString | Belirtilen konumdaki karakterden başlayarak bir dize talep türünün bölümlerini ayıklar ve belirtilen başlangıç dizininden talebin geri kalanını döndürür. SourceClaim - Dönüşümün talep kaynağı. StartIndex - Bu örnekteki bir alt dizenin sıfır tabanlı başlangıç karakteri konumu. Örneğin: sourceClaim - PleaseExtractThisNow StartIndex - 6 Çıkış: ExtractThisNow |
RegexReplace() | RegexReplace() dönüşümü giriş parametresi olarak kabul eder: - Parametre 1: regex girişi olarak bir kullanıcı özniteliği - Kaynağa birden çok değerli olarak güvenme seçeneği - Regex deseni - Değiştirme düzeni. Değiştirme düzeni, regex çıkış gruplarını ve daha fazla giriş parametresini işaret eden bir başvuruyla birlikte statik metin biçimi içerebilir. |
Başka dönüşümlere ihtiyacınız varsa, fikrinizi SaaS uygulama kategorisi altındaki Microsoft Entra Id'deki geri bildirim forumunda gönderin.
Regex tabanlı talep dönüştürme
Aşağıdaki görüntüde ilk dönüştürme düzeyinin bir örneği gösterilmektedir:
Aşağıdaki tablo, ilk dönüştürme düzeyi hakkında bilgi sağlar. Tabloda listelenen eylemler önceki görüntüdeki etiketlere karşılık gelir. Talep dönüştürme dikey penceresini açmak için Düzenle'yi seçin.
Eylem | Alan | Açıklama |
---|---|---|
1 | Transformation |
Dönüştürme seçeneklerinden RegexReplace() seçeneğini belirleyerek beyan dönüştürme için regex tabanlı talep dönüştürme yöntemini kullanın. |
2 | Parameter 1 |
Normal ifade dönüşümü için giriş. Örneğin, gibi admin@fabrikam.com bir kullanıcı e-posta adresi olan user.mail. |
3 | Treat source as multivalued |
Bazı giriş kullanıcı öznitelikleri çok değerli kullanıcı öznitelikleri olabilir. Seçilen kullanıcı özniteliği birden çok değeri destekliyorsa ve kullanıcı dönüştürme için birden çok değer kullanmak istiyorsa, Kaynağı birden çok değerli olarak değerlendir'i seçmesi gerekir. Seçilirse, regex eşleşmesi için tüm değerler kullanılır, aksi takdirde yalnızca ilk değer kullanılır. |
4 | Regex pattern |
Parametre 1 olarak seçilen kullanıcı özniteliğinin değerine göre değerlendirilen normal ifade. Örneğin, kullanıcının e-posta adresinden kullanıcı diğer adını ayıklamaya yönelik normal ifade olarak (?'domain'^.*?)(?i)(\@fabrikam\.com)$ temsil edilir. |
5 | Add additional parameter |
Dönüştürme için birden fazla kullanıcı özniteliği kullanılabilir. Daha sonra özniteliklerin değerleri regex dönüştürme çıkışıyla birleştirilir. En fazla beş parametre daha desteklenir. |
6 | Replacement pattern |
Değiştirme düzeni, regex sonucu için yer tutucular içeren metin şablonudur. Tüm grup adları {group-name} gibi küme ayraçlarının içine sarmalanmalıdır. Yönetimin kullanıcı diğer adını başka bir etki alanı adıyla kullanmak istediğini varsayalım; örneğin xyz.com , ülke adını bu adla birleştirin. Bu durumda, değiştirme deseni {country}.{domain}@xyz.com olur; burada {country} giriş parametresinin değeri ve {domain} normal ifade değerlendirmesinin grup çıktısı olur. Böyle bir durumda beklenen sonuç olur US.swmal@xyz.com . |
Aşağıdaki görüntüde ikinci dönüştürme düzeyi örneği gösterilmektedir:
Aşağıdaki tabloda, ikinci dönüştürme düzeyi hakkında bilgi sağlanmaktadır. Tabloda listelenen eylemler önceki görüntüdeki etiketlere karşılık gelir.
Eylem | Alan | Açıklama |
---|---|---|
1 | Transformation |
Regex tabanlı talep dönüştürmeleri ilk dönüşümle sınırlı değildir ve ikinci düzey dönüştürme olarak da kullanılabilir. Diğer tüm dönüştürme yöntemleri ilk dönüştürme olarak kullanılabilir. |
2 | Parameter 1 |
RegexReplace() ikinci düzey dönüştürme olarak seçilirse, ikinci düzey dönüştürme için giriş olarak birinci düzey dönüşümün çıktısı kullanılır. Dönüşümü uygulamak için ikinci düzey regex ifadesi ilk dönüşümün çıkışıyla eşleşmelidir. |
3 | Regex pattern |
Regex deseni , ikinci düzey dönüştürme için normal ifadedir. |
4 | Parameter input |
İkinci düzey dönüştürmeler için kullanıcı özniteliği girişleri. |
5 | Parameter input |
Yönetici istrator'lar, artık ihtiyaç duymamaları durumunda seçili giriş parametresini silebilir. |
6 | Replacement pattern |
Değiştirme düzeni, regex sonuç grubu adı, giriş parametre grubu adı ve statik metin değeri için yer tutucular içeren metin şablonudur. Tüm grup adları gibi {group-name} küme ayraçlarının içine sarmalanmalıdır. Yönetimin kullanıcı diğer adını başka bir etki alanı adıyla kullanmak istediğini varsayalım; örneğin xyz.com , ülke adını bu adla birleştirin. Bu durumda, değiştirme deseni {country}.{domain}@xyz.com olur; burada {country} giriş parametresinin değeri ve {domain} normal ifade değerlendirmesinin grup çıktısı olur. Böyle bir durumda beklenen sonuç olur US.swmal@xyz.com . |
7 | Test transformation |
RegexReplace() dönüşümü yalnızca Parametre 1 için seçilen kullanıcı özniteliğinin değeri Regex deseni metin kutusunda sağlanan normal ifadeyle eşleşiyorsa değerlendirilir. Eşleşmiyorsa, varsayılan talep değeri belirteci eklenir. Normal ifadeyi giriş parametresi değerine göre doğrulamak için, dönüştürme dikey penceresinde bir test deneyimi sağlanır. Bu test deneyimi yalnızca sahte değerler üzerinde çalışır. Daha fazla giriş parametresi kullanıldığında, parametrenin adı gerçek değer yerine test sonucuna eklenir. Test bölümüne erişmek için Test dönüştürme'yi seçin. |
Aşağıdaki görüntüde dönüştürmeleri test etme örneği gösterilmektedir:
Aşağıdaki tabloda, dönüştürmeleri test etme hakkında bilgi sağlanmaktadır. Tabloda listelenen eylemler önceki görüntüdeki etiketlere karşılık gelir.
Eylem | Alan | Açıklama |
---|---|---|
1 | Test transformation |
Test bölümünü gizlemek için kapat veya (X) düğmesini seçin ve dikey pencerede Test dönüştürme düğmesini yeniden işleyebilirsiniz. |
2 | Test regex input |
Normal ifade testi değerlendirmesi için kullanılan girişi kabul eder. Regex tabanlı talep dönüştürmesinin ikinci düzey dönüştürme olarak yapılandırılması durumunda, ilk dönüşümün beklenen çıkışı olan bir değer sağlayın. |
3 | Run test |
Test regex girişi sağlandıktan ve Regex deseni, Değiştirme deseni ve Giriş parametreleri yapılandırıldıktan sonra, ifade Testi çalıştır seçilerek değerlendirilebilir. |
4 | Test transformation result |
Değerlendirme başarılı olursa, Test dönüştürme sonucu etiketine karşı bir test dönüştürmesi çıkışı işlenir. |
5 | Remove transformation |
İkinci düzey dönüştürme, Dönüşümü kaldır seçilerek kaldırılabilir. |
6 | Specify output if no match |
Normal ifadeyle eşleşmeyen Parametre 1'de bir regex giriş değeri yapılandırıldığında dönüştürme atlanır. Bu gibi durumlarda alternatif kullanıcı özniteliği yapılandırılabilir. Bu öznitelik, eşleşme yoksa çıktıyı belirtin seçeneğini işaretleyerek talep belirtecine eklenebilir. |
7 | Parameter 3 |
Eşleşme olmadığında alternatif bir kullanıcı özniteliği döndürülmesi gerekiyorsa ve Eşleşme yoksa çıkışı belirtin işaretliyse , açılan liste kullanılarak alternatif bir kullanıcı özniteliği seçilebilir. Bu açılan menü Parametre 3'e göre kullanılabilir (eşleşme yoksa çıkış). |
8 | Summary |
Dikey pencerenin en altında, dönüştürmenin basit metindeki anlamını açıklayan biçimin tam özeti görüntülenir. |
9 | Add |
Dönüştürmenin yapılandırma ayarları doğrulandıktan sonra, Ekle'yi seçerek bir talep ilkesine kaydedilebilir. Değişiklikleri kaydetmek için Talebi Yönet dikey penceresinde Kaydet'i seçin. |
RegexReplace() dönüşümü, grup talepleri dönüşümleri için de kullanılabilir.
Dönüştürme doğrulamaları
Test ekle veya çalıştır'ı seçtikten sonra aşağıdaki koşullar oluştuğunda ileti daha fazla bilgi sağlar:
- Yinelenen kullanıcı özniteliklerine sahip giriş parametreleri kullanıldı.
- Kullanılmayan giriş parametreleri bulundu. Tanımlı giriş parametreleri, Değiştirme deseni metninde ilgili kullanıma sahip olmalıdır.
- Sağlanan test regex girişi, sağlanan normal ifadeyle eşleşmiyor.
- Değiştirme düzenindeki gruplar için kaynak bulunamadı.
Talepleri koşullara göre yayma
Beyanın kaynağını kullanıcı türü ve kullanıcının ait olduğu grup temelinde belirtebilirsiniz.
Kullanıcı türü:
- Tümü - Tüm kullanıcıların uygulamaya erişmesine izin verilir.
- Üyeler: Kiracının yerel üyesi
- Tüm konuklar: Kullanıcı, Microsoft Entra Kimliği olan veya olmayan bir dış kuruluştan taşındı.
- Microsoft Entra konukları: Konuk kullanıcı, Microsoft Entra Kimliğini kullanan başka bir kuruluşa aittir.
- Dış konuklar: Konuk kullanıcı, Microsoft Entra Kimliği olmayan bir dış kuruluşa aittir.
Kullanıcı türünün yararlı olduğu senaryolardan biri, bir talebin kaynağının bir uygulamaya erişen konuk ve çalışan için farklı olmasıdır. Kullanıcı bir çalışansa user.email NameID değerinin alınacağını belirtebilirsiniz. Kullanıcı bir konuksa, NameID user.extensionattribute1'den gelir.
Talep koşulu eklemek için:
- Talebi yönet bölümünde Talep koşullarını genişletin.
- Kullanıcı türünü seçin.
- Kullanıcının ait olması gereken grupları seçin. Belirli bir uygulama için tüm taleplerde en fazla 50 benzersiz grup seçebilirsiniz.
- Talebin değerini alacağı Kaynağı seçin. Kaynak öznitelik açılan listesinden bir kullanıcı özniteliği seçebilir veya bunu talep olarak yaymadan önce kullanıcı özniteliğine dönüştürme uygulayabilirsiniz.
Koşulları eklediğiniz sıra önemlidir. Microsoft Entra ilk olarak tüm koşulları kaynakla Attribute
değerlendirir ve ardından talepte hangi değerin yayıldığına karar vermek için kaynak Transformation
ile tüm koşulları değerlendirir. Microsoft Entra Id, yukarıdan aşağıya doğru aynı kaynağa sahip koşulları değerlendirir. Talep, talepteki ifadeyle eşleşen son değeri yayar. gibi IsNotEmpty
dönüştürmeler ve Contains
kısıtlamalar gibi davranır.
Örneğin, Britta Simon Contoso kiracısında bir konuk kullanıcıdır. Britta, Microsoft Entra Id kullanan başka bir kuruluşa aittir. Fabrikam uygulaması için aşağıdaki yapılandırma göz önüne alındığında, Britta Fabrikam'da oturum açmaya çalıştığında, Microsoft kimlik platformu koşulları değerlendirir.
İlk olarak, Microsoft kimlik platformu Britta'nın kullanıcı türünün Tüm konuklar olup olmadığını doğrular. Tür Tüm konuklar olduğundan, Microsoft kimlik platformu talebin kaynağını adresine user.extensionattribute1
atar. İkincisi, Microsoft kimlik platformu Britta'nın kullanıcı türünün Microsoft Entra konukları olup olmadığını doğrular. Tür Tüm konuklar olduğundan, Microsoft kimlik platformu talebin kaynağını adresine user.mail
atar. Son olarak, talep Britta için değeriyle user.mail
birlikte yayılır.
Başka bir örnek olarak, Britta Simon aşağıdaki yapılandırmayı kullanarak oturum açmaya çalıştığında göz önünde bulundurun. Microsoft Entra ilk olarak kaynağıyla Attribute
tüm koşulları değerlendirir. Talebin kaynağı, user.mail
Britta'nın kullanıcı türünün Microsoft Entra konukları olmasıdır. Ardından, Microsoft Entra ID dönüştürmeleri değerlendirir. Britta bir konuk olduğundan, user.extensionattribute1
talebin yeni kaynağıdır. Britta Microsoft Entra konuklarında olduğundan, user.othermail
bu talebin yeni kaynağıdır. Son olarak, talep Britta için değeriyle user.othermail
birlikte yayılır.
Son örnek olarak, Britta yapılandırılmamışsa user.othermail
veya boşsa ne olacağını göz önünde bulundurun. Talep, her iki durumda da koşul girişini yoksaymaya geri döner user.extensionattribute1
.
Güvenlik konuları
Belirteçleri alan uygulamalar üzerinde oynanmayan talep değerlerine dayanır. Belirteç içeriğini talep özelleştirmesi aracılığıyla değiştirdiğinizde, bu varsayımlar artık doğru olmayabilir. Uygulamalar, belirteçlerin kendilerini kötü amaçlı aktörler tarafından oluşturulan özelleştirmelerden korumak için değiştirildiğini açıkça kabul etmelidir. Aşağıdaki yöntemlerden biriyle uygunsuz özelleştirmelerden koruyun:
- Özel imzalama anahtarı yapılandırma
- eşlenmiş talepleri kabul etmek için uygulama bildirimini güncelleştirin.
Bu olmadan, Microsoft Entra Id bir AADSTS50146 hata kodu döndürür.
Özel imzalama anahtarı yapılandırma
Çok kiracılı uygulamalar için özel imzalama anahtarı kullanılmalıdır. Uygulama bildiriminde ayarlamayın acceptMappedClaims
. Azure portalında bir uygulama ayarlarken kiracınızda bir uygulama kayıt nesnesi ve hizmet sorumlusu alırsınız. Bu uygulama, belirteçlerdeki talepleri özelleştirmek için kullanılamayan Azure genel oturum açma anahtarını kullanıyor. Belirteçlerde özel talepler almak için bir sertifikadan özel bir oturum açma anahtarı oluşturun ve bunu hizmet sorumlusuna ekleyin. Test amacıyla otomatik olarak imzalanan bir sertifika kullanabilirsiniz. Özel imzalama anahtarını yapılandırdıktan sonra uygulama kodunuzun belirteç imzalama anahtarını doğrulaması gerekir.
Hizmet sorumlusuna aşağıdaki bilgileri ekleyin:
- Özel anahtar (anahtar kimlik bilgisi olarak)
- Parola (parola kimlik bilgisi olarak)
- Ortak anahtar (anahtar kimlik bilgisi olarak)
Sertifikanızın PFX dosya dışarı aktarmasından kodlanmış özel ve ortak anahtar base-64'leri ayıklayın. "Sign" için kullanılan için öğesinin keyCredential
öğesinin ile eşleştiğinden passwordCredential
keyId
emin keyId
olun. Sertifikanın customkeyIdentifier
parmak izinin karması alınarak oluşturabilirsiniz.
İste
Not
Hizmet sorumlusunda PATCH gerçekleştirmeye çalışmadan önce microsoft Entra yönetim merkezi uygulama kayıtları dikey penceresinden yeni oluşturulan uygulamalarda hizmet sorumlusu kilit yapılandırmasını devre dışı bırakın ve bu da 400 Hatalı İstekle sonuçlanır.
Aşağıdaki örnekte, bir hizmet sorumlusuna özel imzalama anahtarı eklemek için HTTP PATCH isteğinin biçimi gösterilmektedir. Özelliğindeki keyCredentials
"key" değeri okunabilirlik için kısaltılır. Değeri base-64 kodlanmış. Özel anahtar için özellik kullanımı şeklindedir Sign
. Ortak anahtar için özellik kullanımı şeklindedir Verify
.
PATCH https://graph.microsoft.com/v1.0/servicePrincipals/f47a6776-bca7-4f2e-bc6c-eec59d058e3e
Content-type: servicePrincipals/json
Authorization: Bearer {token}
{
"keyCredentials":[
{
"customKeyIdentifier": "lY85bR8r6yWTW6jnciNEONwlVhDyiQjdVLgPDnkI5mA=",
"endDateTime": "2021-04-22T22:10:13Z",
"keyId": "4c266507-3e74-4b91-aeba-18a25b450f6e",
"startDateTime": "2020-04-22T21:50:13Z",
"type": "X509CertAndPassword",
"usage": "Sign",
"key":"MIIKIAIBAz.....HBgUrDgMCERE20nuTptI9MEFCh2Ih2jaaLZBZGeZBRFVNXeZmAAgIH0A==",
"displayName": "CN=contoso"
},
{
"customKeyIdentifier": "lY85bR8r6yWTW6jnciNEONwlVhDyiQjdVLgPDnkI5mA=",
"endDateTime": "2021-04-22T22:10:13Z",
"keyId": "e35a7d11-fef0-49ad-9f3e-aacbe0a42c42",
"startDateTime": "2020-04-22T21:50:13Z",
"type": "AsymmetricX509Cert",
"usage": "Verify",
"key": "MIIDJzCCAg+gAw......CTxQvJ/zN3bafeesMSueR83hlCSyg==",
"displayName": "CN=contoso"
}
],
"passwordCredentials": [
{
"customKeyIdentifier": "lY85bR8r6yWTW6jnciNEONwlVhDyiQjdVLgPDnkI5mA=",
"keyId": "4c266507-3e74-4b91-aeba-18a25b450f6e",
"endDateTime": "2022-01-27T19:40:33Z",
"startDateTime": "2020-04-20T19:40:33Z",
"secretText": "mypassword"
}
]
}
PowerShell kullanarak özel imzalama anahtarı yapılandırma
Bir MSAL Genel İstemci Uygulaması örneği oluşturmak için PowerShell'i kullanın ve Yetkilendirme Kodu Verme akışını kullanarak Microsoft Graph için temsilcili bir izin erişim belirteci alın. Microsoft Graph'ı çağırmak ve hizmet sorumlusu için özel bir imzalama anahtarı yapılandırmak için erişim belirtecini kullanın. Özel imzalama anahtarını yapılandırdıktan sonra uygulama kodunuzun belirteç imzalama anahtarını doğrulaması gerekir.
Bu betiği çalıştırmak için şunları yapmanız gerekir:
- Azure portalındaki Kurumsal Uygulamalar'da uygulamanızın girişinin Genel Bakış dikey penceresinde bulunan uygulamanızın hizmet sorumlusunun nesne kimliği.
- Bir kullanıcıda oturum açmak ve Microsoft Graph'ı çağırmak için erişim belirteci almak için bir uygulama kaydı. Azure portalındaki Uygulama kayıtları uygulama girişinin Genel Bakış dikey penceresinde bu uygulamanın uygulama (istemci) kimliğini alın. Uygulama kaydı aşağıdaki yapılandırmaya sahip olmalıdır:
- "http://localhost" mobil ve masaüstü uygulamaları platform yapılandırmasında listelenir.
- API izinlerinde Microsoft Graph, Application.ReadWrite.All ve User.Read izinlerini temsil etti (bu izinler için Yönetici onay verdiğinizden emin olun).
- Microsoft Graph erişim belirtecini almak için oturum açan bir kullanıcı. Kullanıcı aşağıdaki Microsoft Entra yönetim rollerinden biri olmalıdır (hizmet sorumlusunu güncelleştirmek için gereklidir):
- Bulut Uygulaması Yöneticisi
- Uygulama Yöneticisi
- Genel Yönetici
- Uygulamamız için özel imzalama anahtarı olarak yapılandırılan bir sertifika. Otomatik olarak imzalanan bir sertifika oluşturabilir veya güvenilen sertifika yetkilinizden bir sertifika alabilirsiniz. Betikte aşağıdaki sertifika bileşenleri kullanılır:
- ortak anahtar (genellikle bir .cer dosyası)
- PKCS#12 biçiminde özel anahtar (.pfx dosyasında)
- özel anahtar için parola (pfx dosyası)
Önemli
Microsoft Entra Id diğer biçim türlerini desteklemediğinden özel anahtar PKCS#12 biçiminde olmalıdır. Hizmet sorumlusuna sertifika bilgilerini içeren bir keyCredentials
PATCH uygulamak için Microsoft Graph kullanılırken yanlış biçimin kullanılması "Geçersiz sertifika: Anahtar değeri geçersiz sertifika" hatasına neden olabilir.
$fqdn="fourthcoffeetest.onmicrosoft.com" # this is used for the 'issued to' and 'issued by' field of the certificate
$pwd="mypassword" # password for exporting the certificate private key
$location="C:\\temp" # path to folder where both the pfx and cer file will be written to
# Create a self-signed cert
$cert = New-SelfSignedCertificate -certstorelocation cert:\currentuser\my -DnsName $fqdn
$pwdSecure = ConvertTo-SecureString -String $pwd -Force -AsPlainText
$path = 'cert:\currentuser\my\' + $cert.Thumbprint
$cerFile = $location + "\\" + $fqdn + ".cer"
$pfxFile = $location + "\\" + $fqdn + ".pfx"
# Export the public and private keys
Export-PfxCertificate -cert $path -FilePath $pfxFile -Password $pwdSecure
Export-Certificate -cert $path -FilePath $cerFile
$ClientID = "<app-id>"
$loginURL = "https://login.microsoftonline.com"
$tenantdomain = "fourthcoffeetest.onmicrosoft.com"
$redirectURL = "http://localhost" # this reply URL is needed for PowerShell Core
[string[]] $Scopes = "https://graph.microsoft.com/.default"
$pfxpath = $pfxFile # path to pfx file
$cerpath = $cerFile # path to cer file
$SPOID = "<service-principal-id>"
$graphuri = "https://graph.microsoft.com/v1.0/serviceprincipals/$SPOID"
$password = $pwd # password for the pfx file
# choose the correct folder name for MSAL based on PowerShell version 5.1 (.Net) or PowerShell Core (.Net Core)
if ($PSVersionTable.PSVersion.Major -gt 5)
{
$core = $true
$foldername = "netcoreapp2.1"
}
else
{
$core = $false
$foldername = "net45"
}
# Load the MSAL/microsoft.identity/client assembly -- needed once per PowerShell session
[System.Reflection.Assembly]::LoadFrom((Get-ChildItem C:/Users/<username>/.nuget/packages/microsoft.identity.client/4.32.1/lib/$foldername/Microsoft.Identity.Client.dll).fullname) | out-null
$global:app = $null
$ClientApplicationBuilder = [Microsoft.Identity.Client.PublicClientApplicationBuilder]::Create($ClientID)
[void]$ClientApplicationBuilder.WithAuthority($("$loginURL/$tenantdomain"))
[void]$ClientApplicationBuilder.WithRedirectUri($redirectURL)
$global:app = $ClientApplicationBuilder.Build()
Function Get-GraphAccessTokenFromMSAL {
[Microsoft.Identity.Client.AuthenticationResult] $authResult = $null
$AquireTokenParameters = $global:app.AcquireTokenInteractive($Scopes)
[IntPtr] $ParentWindow = [System.Diagnostics.Process]::GetCurrentProcess().MainWindowHandle
if ($ParentWindow)
{
[void]$AquireTokenParameters.WithParentActivityOrWindow($ParentWindow)
}
try {
$authResult = $AquireTokenParameters.ExecuteAsync().GetAwaiter().GetResult()
}
catch {
$ErrorMessage = $_.Exception.Message
Write-Host $ErrorMessage
}
return $authResult
}
$myvar = Get-GraphAccessTokenFromMSAL
if ($myvar)
{
$GraphAccessToken = $myvar.AccessToken
Write-Host "Access Token: " $myvar.AccessToken
#$GraphAccessToken = "eyJ0eXAiOiJKV1QiL ... iPxstltKQ"
# this is for PowerShell Core
$Secure_String_Pwd = ConvertTo-SecureString $password -AsPlainText -Force
# reading certificate files and creating Certificate Object
if ($core)
{
$pfx_cert = get-content $pfxpath -AsByteStream -Raw
$cer_cert = get-content $cerpath -AsByteStream -Raw
$cert = Get-PfxCertificate -FilePath $pfxpath -Password $Secure_String_Pwd
}
else
{
$pfx_cert = get-content $pfxpath -Encoding Byte
$cer_cert = get-content $cerpath -Encoding Byte
# Write-Host "Enter password for the pfx file..."
# calling Get-PfxCertificate in PowerShell 5.1 prompts for password
# $cert = Get-PfxCertificate -FilePath $pfxpath
$cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($pfxpath, $password)
}
# base 64 encode the private key and public key
$base64pfx = [System.Convert]::ToBase64String($pfx_cert)
$base64cer = [System.Convert]::ToBase64String($cer_cert)
# getting id for the keyCredential object
$guid1 = New-Guid
$guid2 = New-Guid
# get the custom key identifier from the certificate thumbprint:
$hasher = [System.Security.Cryptography.HashAlgorithm]::Create('sha256')
$hash = $hasher.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($cert.Thumbprint))
$customKeyIdentifier = [System.Convert]::ToBase64String($hash)
# get end date and start date for our keycredentials
$endDateTime = ($cert.NotAfter).ToUniversalTime().ToString( "yyyy-MM-ddTHH:mm:ssZ" )
$startDateTime = ($cert.NotBefore).ToUniversalTime().ToString( "yyyy-MM-ddTHH:mm:ssZ" )
# building our json payload
$object = [ordered]@{
keyCredentials = @(
[ordered]@{
customKeyIdentifier = $customKeyIdentifier
endDateTime = $endDateTime
keyId = $guid1
startDateTime = $startDateTime
type = "X509CertAndPassword"
usage = "Sign"
key = $base64pfx
displayName = "CN=fourthcoffeetest"
},
[ordered]@{
customKeyIdentifier = $customKeyIdentifier
endDateTime = $endDateTime
keyId = $guid2
startDateTime = $startDateTime
type = "AsymmetricX509Cert"
usage = "Verify"
key = $base64cer
displayName = "CN=fourthcoffeetest"
}
)
passwordCredentials = @(
[ordered]@{
customKeyIdentifier = $customKeyIdentifier
keyId = $guid1
endDateTime = $endDateTime
startDateTime = $startDateTime
secretText = $password
}
)
}
$json = $object | ConvertTo-Json -Depth 99
Write-Host "JSON Payload:"
Write-Output $json
# Request Header
$Header = @{}
$Header.Add("Authorization","Bearer $($GraphAccessToken)")
$Header.Add("Content-Type","application/json")
try
{
Invoke-RestMethod -Uri $graphuri -Method "PATCH" -Headers $Header -Body $json
}
catch
{
# Dig into the exception to get the Response details.
# Note that value__ is not a typo.
Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__
Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
}
Write-Host "Complete Request"
}
else
{
Write-Host "Fail to get Access Token"
}
Belirteç imzalama anahtarını doğrulama
Talep eşlemesi etkin olan uygulamaların, OpenID Bağlan meta veri isteklerine ekleyerek appid={client_id}
belirteç imzalama anahtarlarını doğrulamaları gerekir. Aşağıdaki örnek, kullanmanız gereken OpenID Bağlan meta veri belgesinin biçimini gösterir:
https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration?appid={client-id}
Uygulama bildirimini güncelleştirme
Tek kiracılı uygulamalar için özelliğini true
uygulama bildiriminde olarak ayarlayabilirsinizacceptMappedClaims
. Kaynak türünde belgelendiği apiApplication
gibi. özelliğinin ayarlanması, bir uygulamanın özel imzalama anahtarı belirtmeden talep eşlemesini kullanmasına olanak tanır.
Uyarı
Çok kiracılı uygulamalar için acceptMappedClaims özelliğini true olarak ayarlamayın. Bu özellik, kötü niyetli aktörlerin uygulamanız için talep eşleme ilkeleri oluşturmasına olanak tanıyabilir.
İstenen belirteç hedef kitlesinin Microsoft Entra kiracınızın doğrulanmış bir etki alanı adını kullanması gerekir. Bu, örneğin veya (yalnızca varsayılan kiracı adını kullanarak) olarak ayarlamanız Application ID URI
gerektiği anlamına gelir (uygulama bildiriminde ile gösteriliridentifierUris
). https://contoso.onmicrosoft.com/my-api
https://contoso.com/my-api
Doğrulanmış bir etki alanı kullanmıyorsanız, Microsoft Entra ID "_AcceptMappedClaims yalnızca uygulama GUID'si ile eşleşen bir belirteç hedef kitlesi veya kiracının doğrulanmış etki alanlarındaki bir hedef kitle için desteklenir" iletisini içeren bir AADSTS501461
hata kodu döndürür. Kaynak tanımlayıcısını değiştirin veya uygulamaya özgü bir imzalama anahtarı kullanın."
Gelişmiş talep seçenekleri
SAML belirteçleriyle aynı talebi ortaya çıkarmak için OIDC uygulamaları için gelişmiş talep seçeneklerini yapılandırın. Ayrıca hem SAML2.0 hem de OIDC yanıt belirteçleri için aynı talebi kullanmayı planlayan uygulamalar için.
Talepleri yönet dikey penceresindeki Gelişmiş Talep Seçenekleri'nin altındaki kutuyu işaretleyerek gelişmiş talep seçeneklerini yapılandırın.