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.
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