2016-07-06 21 views
11

Tôi đang cố gắng sử dụng gói System.IdentityModel.Tokens.Jwt để tạo mã thông báo. Tôi tìm thấy một số mẫu mã trực tuyến, khá đơn giản, nhưng sau đó tôi chạy vào một lỗi mà tôi không thể tìm ra. Dưới đây là đoạn code tôi đang sử dụng (đã được sửa đổi đôi chút cho ngắn gọn):Lỗi khi cố gắng tạo mã thông báo bằng cách sử dụng thư viện .NET JWT

<%@ Application Language="C#" %> 
<%@ Import Namespace="System" %> 
<%@ Import Namespace="System.Text" %> 
<%@ Import Namespace="System.Reflection" %> 
<%@ Import Namespace="System.Collections" %> 
<%@ Import Namespace="System.IdentityModel.Tokens" %> 
<%@ Import Namespace="System.IdentityModel.Tokens.Jwt" %> 
<%@ Import Namespace="System.Security.Claims" %> 
<%@ Import Namespace="System.IdentityModel.Protocols.WSTrust" %> 

<script runat="server"> 
    public class TestClass 
    { 
     public static string GetJwtToken() 
     { 
      var tokenHandler = new JwtSecurityTokenHandler(); 
      var input = "anyoldrandomtext"; 
      var securityKey = new byte[input.Length * sizeof(char)]; 
      Buffer.BlockCopy(input.ToCharArray(), 0, securityKey, 0, securityKey.Length); 
      var now = DateTime.UtcNow; 
      var tokenDescriptor = new SecurityTokenDescriptor 
      { 
       Subject = new ClaimsIdentity(new[] 
       { 
       new Claim(ClaimTypes.UserData, 
       "IsValid", ClaimValueTypes.String, "(local)") 
       }), 
       TokenIssuerName = "self", 
       AppliesToAddress = "https://www.mywebsite.com", 
       Lifetime = new Lifetime(now, now.AddMinutes(60)), 
       SigningCredentials = new SigningCredentials(new InMemorySymmetricSecurityKey(securityKey), 
        "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256", 
        "http://www.w3.org/2001/04/xmlenc#sha256"), 
      }; 

      var token = tokenHandler.CreateToken(tokenDescriptor); 
      var tokenString = tokenHandler.WriteToken(token); 

      return tokenString; 
     } 
    } 
</script> 

tôi tiếp tục nhận được lỗi sau tại dòng 113 (var thẻ = tokenHandler.CreateToken (tokenDescriptor);):

Đối số 1: không thể chuyển đổi từ 'System.IdentityModel.Tokens.SecurityTokenDescriptor' sang 'Microsoft.IdentityModel.Tokens.SecurityTokenDescriptor'

Nhưng tôi đã thấy nhiều ví dụ trực tuyến thực hiện mọi việc chính xác như tôi đã thực hiện chúng. Tôi cũng chạy vào bài viết này (https://msdn.microsoft.com/en-us/library/jj157089(v=vs.110).aspx) mà khẳng định như sau:

Trong WIF 3.5, tất cả các lớp WIF được chứa trong Microsoft.IdentityModel lắp ráp (microsoft.identitymicrosoft.identitymodel.dll). Trong WIF 4.5, các lớp WIF đã được chia thành các nhóm sau: mscorlib (mscorlib.dll), System.IdentityModel (System.IdentityModel.dll), System.IdentityModel.Services (System.IdentityModel.Services.dll) và System.ServiceModel (System.ServiceModel.dll).

Tất cả các lớp WIF 3.5 đều có trong một trong các không gian tên Microsoft.IdentityModel; ví dụ: Microsoft.IdentityModel, Microsoft.IdentityModel.Tokens, Microsoft.IdentityModel.Web, v.v. Trong WIF 4.5, các lớp WIF hiện được trải rộng trên các vùng tên System.IdentityModel, không gian tên System.Security.Claims và không gian tên System.ServiceModel.Security . Ngoài việc tổ chức lại này, một số WIF 3.5 lớp học đã được giảm xuống trong WIF 4.5.

tôi đã cố gắng để gỡ lỗi vì để chuyển sang sử dụng Microsoft. * Namespace cho SecurityTokenDescriptor, và sau đó tôi nhận được một loạt các lỗi nói TokenIssuerName, AppliesToAddress, và trọn đời không được tính hợp lệ cho lớp đó. Tuy nhiên, khi tôi xem các tài liệu trực tuyến, có vẻ như các thuộc tính đó tồn tại trên Microsoft.IdentityModel.Tokens.SecurityTokenDescriptor. Tuy nhiên, trong Visual Studio của tôi, khi tôi đi đến định nghĩa cho lớp đó, họ không có, dẫn tôi tin rằng có một số loại vấn đề cấu hình trong Visual Studio của tôi. Trong trình quản lý gói của tôi, nó cho thấy tôi đã cài đặt Microsoft.IdentityModel.Tokens v5.0.0. Tôi cũng đã thay đổi dự án thành .NET framework 4.5.1 vì thư viện JWT yêu cầu nó. Ngoài ra, tôi không biết nơi nào khác để nhìn.

Trả lời

30

tôi chạy vào một tình huống tương tự với thư viện OpenID Connect khi tôi nâng cấp, mà trước đây là trong Microsoft.IdentityModel.Protocol.Extensions gói (mà phụ thuộc vào 4.0.2 của gói JWT) nhưng bây giờ là Microsoft.IdentityModel.Protocols.OpenIdConnect mà phụ thuộc vào 2.0.0 của Microsoft.IdentityModel.Protocols (phụ thuộc vào 5.0.0 của gói JWT).

Xóa mọi gói Microsoft.IdentityModel*System.IdentityModel* của bạn và chỉ cài đặt gói mới nhất (5.0.0) System.IdentityModel.Tokens.Jwt phụ thuộc vào Microsoft.IdentityModel.Tokens.

Bạn sẽ muốn sử dụng báo cáo cho các không gian tên:

  • Microsoft.IdentityModel.Tokens (nhưng không System.IdentityModel.Tokens)
  • System.IdentityModel.Tokens.Jwt
  • System.Security .Claims

Microsoft đã đơn giản hóa một số thông số giống như những gì bạn mong đợi từ thư viện JWT của các nền tảng khác, do đó, các thuộc tính SecurityTokenDescriptor là ittle khác nhau:

var tokenDescriptor = new SecurityTokenDescriptor 
{ 
    Subject = new ClaimsIdentity(new[] 
    { 
     new Claim(ClaimTypes.UserData, 
     "IsValid", ClaimValueTypes.String, "(local)") 
    }), 
    Issuer = "self", 
    Audience = "https://www.mywebsite.com", 
    Expires = now.AddMinutes(60), 
    SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(securityKey), SecurityAlgorithms.HmacSha256), 
}; 

Lưu ý rằng SecurityAlgorithms.HmacSha256 là hằng số chuỗi cho "HS256", giống như bạn sử dụng trong hầu hết các thư viện khác. Sử dụng mã trên cộng với ví dụ trong câu hỏi của bạn, bạn sẽ có thể tạo một JWT hợp lệ.

+0

Cuối cùng cũng đã thử nghiệm điều này và nó hoạt động rất tốt. Cảm ơn nhiều! – Rocket04

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