2015-12-05 13 views
5

Có vẻ như tôi không thể thêm xác nhận quyền sở hữu tùy chỉnh (tùy theo người dùng) vào cuộc gọi đầu tiên của tôi đến Máy chủ định danh. Ai đó có thể xác nhận giả định đó?Tìm kiếm xác nhận rằng IdentityServer 3 không hỗ trợ Xác nhận quyền sở hữu tùy chỉnh mà không cần gọi đến máy chủ

Đây là những gì chúng tôi đang làm trong ứng dụng của chúng tôi: Sử dụng ResourceOwner Flow, ứng dụng web của chúng tôi (phía máy chủ) gọi Identity Server gửi đăng nhập và mật khẩu và phạm vi của người dùng.

Chúng tôi lấy lại một JWT chứa các xác nhận quyền sở hữu tiêu chuẩn như phụ, idp, client_id; nhưng chúng tôi muốn thêm một cái nữa. Để đơn giản hóa, giả sử thêm một xác nhận quyền sở hữu là địa chỉ email của người dùng.

Dường như chúng tôi phải thực hiện một cuộc gọi khác đến Máy chủ danh tính và nhận mã thông báo mới. Đúng không? Không có cách nào chúng ta có thể nhận được giá trị đó trong cuộc gọi ban đầu?

Trả lời

4

Xin lỗi là người trả lời câu hỏi của riêng tôi, nhưng tôi đã tìm hiểu cách thực hiện công việc này.

  1. Tạo phạm vi tùy chỉnh. Đảm bảo rằng Type = ScopeType.Resource và IncludeAllClaimsForUser = false và thêm một tập hợp các Claims vào scope, và thiết lập tham số thứ hai của ScopeClaim thành true.
  2. Thêm phạm vi tùy chỉnh cho khách hàng của bạn.
  3. Trong ghi đè IUserService của bạn, trong AuthenticateLocalAsync, hãy đảm bảo chuyển user.Claims làm thông số thứ 3 trong lệnh gọi AuthenticateResult.
  4. Trong override IUserService của bạn, trong GetProfileDataAsync thêm đoạn mã sau:

    if (context.RequestedClaimTypes != null) 
    { 
        List<Claim> newclaims = new List<Claim>(); 
        foreach (Claim claim in context.Subject.Claims) 
        { 
         if (context.RequestedClaimTypes.Contains(claim.Type)) 
         { 
          newclaims.Add(claim); 
         } 
        } 
        context.IssuedClaims = newclaims; 
    } 
    return Task.FromResult(context.IssuedClaims); 
    
  5. Cuối cùng, để đảm bảo rằng GetProfileDataAsync bắn mỗi khi người dùng đăng nhập, không chỉ là lần đầu tiên, hãy chắc chắn rằng bạn làm chưa bật bộ nhớ đệm. Điều này có thể có nghĩa là loại bỏ một dòng mã trong khởi động của bạn trông giống như sau: factory.ConfigureUserServiceCache().

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