2016-07-23 35 views
5

ASP.NET Core 5 với ASP.NET Identity 3.0, tôi đang sử dụng cả trang web và apis. Tôi đang sử dụng OpenIddict để phát hành mã thông báo JWT và để xác thực. Mã của tôi trông giống như vậy:Ủy quyền qua mã thông báo JWT

X509Certificate2 c = new X509Certificate2(@"tokensign.p12", "MyCertificatePassword"); 

    services.AddOpenIddict<WebUser, IdentityRole<int>, WebDbContext, int>() 
     .EnableTokenEndpoint("/api/customauth/login") 
     .AllowPasswordFlow() 
     .UseJsonWebTokens() 
     .AddSigningCertificate(c); 

Nếu tôi tắt UseJsonWebTokens(), tôi có thể tạo mã thông báo và ủy quyền thành công. Tuy nhiên, tôi không chắc chắn rằng chứng chỉ của tôi đang xác thực mã thông báo trả lại.

Và khi bật UseJsonWebTokens, tôi có thể phát hành mã thông báo JWT ở điểm cuối này. Tuy nhiên, tôi không thể xác thực bất kỳ yêu cầu nào!

Tôi đang sử dụng đoạn mã sau trong cấu hình ứng dụng:

app.UseJwtBearerAuthentication(new JwtBearerOptions 
    { 
     AutomaticAuthenticate = true, 
     AutomaticChallenge = true, 
     RequireHttpsMetadata = false, 
     Authority = "http://localhost:60000/", 
     Audience = "http://localhost:60000/", 
    }); 
    app.UseOAuthValidation(); 
    app.UseIdentity(); 
    app.UseOpenIddict(); 
    app.UseMvcWithDefaultRoute(); 
  • Làm thế nào tôi có thể thực thi các yêu cầu để được xác nhận với giấy chứng nhận của tôi để chắc chắn rằng các dấu hiệu JWT không bị sửa đổi.
  • Cài đặt chính xác sẽ cho phép xác thực và ủy quyền mã thông báo JWT của tôi là gì, nếu tôi không sử dụng JWT, tôi sẽ được ủy quyền thành công.
+0

Vui lòng không đặt thẻ vào tiêu đề câu hỏi! http://stackoverflow.com/help/tagging – Tseng

Trả lời

5

Nếu tôi tắt UseJsonWebTokens(), tôi có thể tạo mã thông báo và ủy quyền thành công. Tuy nhiên, tôi không chắc chắn rằng chứng chỉ của tôi đang xác thực mã thông báo trả lại.

Trong ASOS (server khuôn khổ OpenID Connect đằng sau OpenIddict), có 2 khác nhau được xây dựng trong cơ chế serialization để tạo và bảo vệ thẻ:

  • Một sử dụng IdentityModel (thư viện phát triển bởi Microsoft) và tạo ra thẻ tiêu chuẩn kiểm chứng bởi các bên thứ ba:

tokens Identity (JWT theo định nghĩa) luôn tạo ra sử dụng thi và bạn có thể gọi UseJsonWebTokens() để buộc OpenIddict phát hành mã thông báo truy cập sử dụng cùng một quá trình tuần tự hóa.

Chứng chỉ bạn chỉ định khi gọi AddSigningCertificate() luôn được sử dụng để ký các mã thông báo này.

  • Một sử dụng stack Bảo vệ dữ liệu ASP.NET Lõi (còn được phát triển bởi Microsoft):

đống này độc quyền sản xuất tokens "độc quyền" mà không có nghĩa là để được đọc hoặc xác nhận bởi bên thứ ba, vì định dạng mã thông báo không phải là tiêu chuẩn và nhất thiết phải dựa vào ký và mã hóa đối xứng.

Đó là cơ chế chúng tôi sử dụng cho mã ủy quyền và mã thông báo làm mới, chỉ có nghĩa là được sử dụng bởi chính OpenIddict. Nó cũng được sử dụng cho mã thông báo truy cập khi bạn sử dụng định dạng mã thông báo mặc định.

Trong trường hợp này, chứng chỉ bạn chỉ định khi gọi AddSigningCertificate() không được sử dụng.Thay vào đó, các mã thông báo này luôn được mã hóa bởi ngăn xếp Bảo vệ dữ liệu bằng cách sử dụng thuật toán Authenticated Encryption (theo mặc định, AES-256-CBC với HMACSHA256), cung cấp tính xác thực, toàn vẹn và bảo mật. Đối với điều đó, 2 khóa (một cho mã hóa, một để xác thực) được bắt nguồn từ ngăn xếp Bảo vệ dữ liệu từ một trong các khóa chính được lưu trữ trong vòng khóa.

Làm cách nào để thực thi yêu cầu được xác thực bằng chứng chỉ của tôi để đảm bảo mã thông báo JWT không bị giả mạo. Cài đặt chính xác sẽ cho phép xác thực và ủy quyền mã thông báo JWT của tôi là gì, nếu tôi không sử dụng JWT, tôi sẽ được ủy quyền thành công.

Để trả lời những câu hỏi này, điều này sẽ hữu ích nếu bạn bật ghi nhật ký và chia sẻ dấu vết của mình.

+1

Khóa ký tên được sử dụng bởi IdentityModel mặc định này là gì? Trong trường hợp tôi muốn sử dụng một trang trại. – Adam

+1

Khoá ký tên là chứng chỉ X.509 bạn sử dụng (chính xác hơn khóa RSA mà nó chứa) – Pinpoint

+1

Vòng chìa khóa là gì? Làm cách nào để lưu trữ khóa chính trong đó? Điều này đòi hỏi một cuộc gọi đến 'AddSigningKey()' trong khi khởi động? –

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