2016-04-22 25 views
6

tôi thêm vai trò administrators để tuyên bố người dùng sau khi xác thực với một impelimentation IClaimsTransformer như thế này:Các User.IsInRole ("Quản trị viên") với IClaimsTransformer luôn sai

(principal.Identity as ClaimsIdentity).AddClaim(new Claim(ClaimTypes.Role, "Administrators")); Nhưng khi tôi gọi User.IsInRole("Administrators") trong Razor tôi xem nó trở lại sai.

+0

bạn đã thử thêm xác nhận quyền sở hữu chính xác chưa ?, nghĩa là tôi không cho rằng nó không phân biệt chữ hoa chữ thường –

+0

Có. Tôi thấy vai trò trong xác nhận quyền sở hữu của người dùng khi tôi gỡ lỗi. –

+0

bạn đã thử .HasClaim để xem liệu nó có khác biệt không? bạn có chắc chắn việc kiểm tra khiếu nại xảy ra sau khi chuyển đổi không? –

Trả lời

1

Tôi đang làm điều gì đó tương tự trong giải pháp dựa trên API, nhưng tôi đặt xác nhận quyền sở hữu vai trò khi tạo người dùng thay vì trong máy biến áp.

Sau khi xem User.IsInRole()documentation, có vẻ như phương pháp này được thiết kế để kéo từ bộ nhớ cache trước.

Trước tiên IsInRole kiểm tra thuộc tính IsRoleListCached để xác định liệu danh sách lưu trữ tên vai trò cho người dùng hiện tại có sẵn hay không. Nếu thuộc tính IsRoleListCached là đúng, danh sách được lưu trong bộ nhớ cache được chọn cho vai trò được chỉ định. Nếu phương thức IsInRole tìm thấy vai trò được chỉ định trong danh sách được lưu trong bộ nhớ cache, nó sẽ trả về giá trị true. Nếu IsInRole không tìm thấy vai trò được chỉ định, nó gọi phương thức GetRolesForUser của trường hợp Nhà cung cấp mặc định để xác định xem tên người dùng có được liên kết với vai trò từ nguồn dữ liệu cho giá trị ApplicationName được định cấu hình hay không.

tôi nghi ngờ kể từ ClaimTypes.Role là một tuyên bố chung và không phải là một tùy chỉnh tên miền cụ thể khẳng định (mà tôi tin là việc sử dụng hợp cụ thể cho một ClaimsTransformer), các ứng dụng đang sử dụng một mặc định, lưu trữ, tiền chuyển giá trị.

Phần lớn đây là suy đoán. Bạn có thể thử đặt xác nhận quyền sở hữu khi tạo người dùng. Tôi làm điều đó bằng cách sử dụng lớp UserManager.

var claimsResult = await _userManager.AddClaimAsync(applicationUser, new Claim(ClaimsIdentity.DefaultRoleClaimType, "Administrator")); 
Các vấn đề liên quan