2014-07-20 20 views
15

Tôi đang phát triển một ứng dụng web với mã thông báo mang tên Asp.Net 5 MVC, Owin và Oauth2 làm loại xác thực.Lưu trữ danh sách chuỗi trong Xác nhận quyền sở hữu (System.Security.Claims)

Tôi cần lưu trữ danh sách chuỗi "CODEFOO,CODBAR,CODEX,.." bên trong một System.Security.Claims.Claim với Loại xác nhận quyền sở hữu tùy chỉnh.

Khi người dùng yêu cầu mã thông báo, danh sách "mã người dùng" này nhận được từ phía sau và được đặt bên trong danh tính bằng cách sử dụng loại xác nhận quyền sở hữu tùy chỉnh cụ thể.
Khi người dùng gửi lại mã thông báo, điều hướng một Hành động MVC cụ thể, ứng dụng phải kiểm tra xem danh sách mã người dùng bên trong xác nhận quyền sở hữu có chứa một mã cụ thể hay không.

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

Hiện tại tôi đang sắp xếp danh sách chuỗi bằng JSON.

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

và làm cho nó trở lại de-serializing nó với một cái gì đó như thế này:

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

Bây giờ câu hỏi: là có một cách tốt hơn để lưu trữ một danh sách các giá trị bên trong một tuyên bố?
yêu cầu bồi thường có một tài sản mà tài liệu nói ValueType:

Khách sạn ValueType chứa một chuỗi xác định loại thông tin giá trị. Thuộc tính này có thể được sử dụng để hiểu định dạng của giá trị và cung cấp thông tin về cách sắp xếp theo thứ tự và deserialize giá trị. Nếu giải pháp của bạn yêu cầu giá trị phức tạp loại, bạn nên sử dụng các loại lược đồ XML tiêu chuẩn trong thuộc tính ValueType ValueType để chỉ ra cách giá trị Thuộc tính có nghĩa là được tuần tự hóa và được deserialized từ một chuỗi.

Thật không may tôi đã không tìm thấy bất kỳ ví dụ nào ghi lại việc sử dụng thuộc tính đó.
Việc tuần tự hóa Json có ổn không hoặc tôi có nên sử dụng phương thức ValueType không?

+0

Tại sao bạn không thêm nhiều xác nhận quyền sở hữu? –

Trả lời

15

ValueType là cách để mã của bạn xác định cách giá trị được hiểu/deserialized, chẳng hạn như có chứa một loại lược đồ XML. Nếu được sử dụng giữa các mã từ các nguồn khác nhau, nó có ý nghĩa, nhưng trong ứng dụng của riêng bạn, bạn có thể bỏ qua nó miễn là bạn biết cách diễn giải nội dung.

Nhưng để có nhiều giá trị, bạn sẽ không cần sử dụng các loại phức tạp. Danh tính xác nhận quyền sở hữu có thể có nhiều xác nhận quyền sở hữu với cùng một số ClaimType, vì vậy thay vì tuần tự hóa các mã thành chuỗi JSon, bạn chỉ cần thêm nhiều xác nhận quyền sở hữu; một cho mỗi mã người dùng. Tất cả đều có cùng một loại xác nhận quyền sở hữu. Điều đó sẽ giúp bạn có thể sử dụng phương thức HasClaim để kiểm tra xem có mã người dùng cụ thể không.

+0

Tôi tin rằng bạn đang bối rối 'ValueType', biểu thị loại giá trị, với Loại xác nhận quyền sở hữu. – systempuntoout

+0

Bạn hoàn toàn đúng, đã cập nhật câu trả lời của tôi. –

4

Gắn bó với JSON hoặc sử dụng Xác nhận quyền sở hữu đa giá trị (thuộc tính đa giá trị trong điều khoản LDAP).

Đừng nhầm lẫn giữa System.Security.Claims.Claim.Type và Claim.ValueType. Loại là "Tên xác nhận quyền sở hữu" (Tên thuộc tính trong LDAP nói). Xem System.Security.Claims.ClaimTypes cho mẫu uris. ValueType dành cho tuần tự hóa XML. Xem System.Security.Claims.ClaimValueTypes cho mẫu uris.

Bạn đang suy nghĩ về việc sử dụng ValueType để tuần tự đúng cách. Nó không phải là hoàn toàn không thể, bạn sẽ cần phải tự mình lập trình nó. Tôi sợ rằng không có nhiều người khác có thể đối phó với nó (trong một Mã SAML). Vì vậy, không, trừ khi họ đang nắm giữ một khẩu súng trên bạn. Dominick cũng cảnh báo bạn.

Bạn cần viết một số thứ, xem: http://social.msdn.microsoft.com/Forums/vstudio/en-US/a11365c2-9b44-49db-97f2-50c30adff14d/complex-type-in-claims Điều này dành cho WIF 3.5, nhưng nguyên tắc là như nhau trong .NET 4.5.

+0

Cảm ơn phản hồi của bạn. Tôi nghĩ rằng tôi sẽ cố gắng tạo nhiều xác nhận quyền sở hữu với cùng loại như đề xuất của Anders Abel. – systempuntoout

Các vấn đề liên quan