2014-07-20 28 views
15

Ben auth türü olarak Asp.Net 5 MVC, Owin ve OAuth2 hamiline belirteci ile bir web uygulaması geliştiriyorum saklanması.İstem içinde dize bir listesini (System.Security.Claims)

System.Security.Claims.Claim dizesinin özel bir hak talebi türü ile "CODEFOO,CODBAR,CODEX,.." dizesinin bir listesini kaydetmem gerekiyor. Kullanıcı bir belirteç istediğinde

, "kullanıcı kodlarının" Bu liste arka ucundan almak ve belirli bir özel talep türünü kullanarak kimlik içeride kümesidir.
Kullanıcı belirli bir MVC Eylemi'nde gezinirken, belirteç geri gönderdiğinde, uygulama, talep içindeki kullanıcı kodlarının listesinin belirli bir kod içerip içermediğini kontrol etmelidir.

List<string> userCodes = rep.GetUserCodeFromBackEnd(); 
string userCodesClaimType = "http://foo.it/claim/usercodesclaimtype"; 

Şu anda JSON içindeki dize listesini serileştiriyorum.

var claim = new Claim(userCodesCaimType, JsonConvert.SerializeObject(userCodes)); 

ve geri de-serializing olsun böyle bir şeyle: bir iddia içindeki değerler listesini depolamak için daha iyi bir yolu vardır:

var userCodesClaim = identity.Claims.FirstOrDefault<Claim>(c=>c.Type == userCodesClaimType) ; 
var userCodesClaimValue = JsonConvert.DeserializeObject<List<string>>(userCodesClaim.Value); 

Şimdi soru

?

ValueType mülkiyet değerinin tip bilgisini tanımlayan bir dize içerir:
İddia belgelerine diyen bir ValueType özelliğine sahiptir. Bu özellik, değerin biçimini anlamak ve serileştirme hakkında bilgi sağlamak ve değeri deserialize etmek için kullanılabilir. Çözümünüz karmaşık değerini türlerini gerektiriyorsa, değer özellik seri ve dizesinden serileştirilemezse olması gerekiyordu nasıl göstermek için ValueType özelliğinde standart XML şema türlerini kullanmak önerilir.

Açıkçası Ben bu özelliğin kullanımını belgeleyen herhangi bir örnek bulamadım.
Json serileştirmesi tamam mı, yoksa ValueType yaklaşımını kullanmalı mıyım? ValueType

+0

Neden birden çok hak talebi eklemiyorsunuz? –

cevap

15

kodunuzu değeri böyle bir XML şema içeriyor olarak, serileştirilemezse/yorumlanabilir ne kadar tanımlamak için kullanılan bir yöntemdir. Farklı kaynaklardan kodlar arasında kullanılıyorsa, mantıklıdır, ancak kendi uygulamanızda içeriği nasıl yorumlayacağınızı bildiğiniz sürece göz ardı edebilirsiniz.

Ancak birden çok değere sahip olmak için karmaşık türler kullanmanız gerekmeyecektir. Bir iddia kimliği, aynı ClaimType ile birden çok hak talebine sahip olabilir, bu yüzden kodları bir JSon dizisine serileştirmek yerine, yalnızca birden çok hak talebi eklemelisiniz; Her kullanıcı kodu için bir tane. Hepsi aynı talep tipine sahip. Bu, belirli bir kullanıcı kodunun mevcut olup olmadığını kontrol etmek için HasClaim yönteminin kullanılmasını mümkün kılacaktır.

+0

Değer Türüyle, değerin türünü temsil eden "ValueType" değerini karıştırdığınıza inanıyorum. – systempuntoout

+0

Tamamen haklısın, cevabımı güncelledim. –

4

JSON ile yapıştırın veya Multivalued Talebi (LDAP terimlerinde multivalued özniteliği) kullanın.

en System.Security.Claims.Claim.Type ve Claim.ValueType karıştırmayalım. Tür, "Talep adı" (LDAP dilinde Öznitelik adı) 'dir. Örnek uris için bkz. System.Security.Claims.ClaimTypes. ValueType XML serileştirme içindir. Örnek uris için bkz. System.Security.Claims.ClaimValueTypes.

Doğru şekilde serileştirmek için ValueType kullanmayı düşünüyordunuz. Tamamen imkansız değil, kendiniz programlamanız gerekecek. Onunla uğraşabilecek pek çok kişi olmadığı için korkuyorum (bir SAML Jetonunda). Öyleyse, senin üzerinde bir silah bulundurmadıkça. Dominick de seni uyardı.

Bazı şeyler yazmanız gerekir, bkz .: http://social.msdn.microsoft.com/Forums/vstudio/en-US/a11365c2-9b44-49db-97f2-50c30adff14d/complex-type-in-claims Bu WIF 3.5 için yapıldı, ancak ilke .NET 4.5 altında aynıdır.

+0

Geri bildiriminiz için teşekkür ederiz. Anders Abel'ın önerdiği gibi aynı türden çok sayıda iddia üretmeye çalışacağımı düşünüyorum. – systempuntoout