我正在尝试使用包System.IdentityModel.Tokens.Jwt生成 token 。我在网上找到了一些代码示例,非常简单明了,但是后来遇到了一个我不知道的错误。这是我正在使用的代码(为简洁起见,已进行了一些修改):

<%@ 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>

我在第113行(var token = tokenHandler.CreateToken(tokenDescriptor);)不断收到以下错误:

参数1:无法从“System.IdentityModel.Tokens.SecurityTokenDescriptor”转换为“Microsoft.IdentityModel.Tokens.SecurityTokenDescriptor”

但是,我已经看到许多在线示例与我所做的完全一样。我还遇到了这篇文章(https://msdn.microsoft.com/en-us/library/jj157089(v=vs.110).aspx),其中指出:



我尝试调试时将其切换为对SecurityTokenDescriptor使用Microsoft。* namespace ,然后又收到另一系列错误,指出TokenIssuerName,AppliesToAddress和Lifetime对该类不是有效属性。但是,当我在线查看文档时,似乎这些属性确实存在于Microsoft.IdentityModel.Tokens.SecurityTokenDescriptor上。但是在我的Visual Studio中,当我为该类执行“转到定义”时,它们并不存在,这使我相信Visual Studio中存在某种配置问题。在我的程序包管理器中,它显示我已经安装了Microsoft.IdentityModel.Tokens v5.0.0。我还将该项目更改为.NET Framework 4.5.1,因为JWT库需要它。除此之外,我不知道还要看什么。

最佳答案

升级时,我遇到了与OpenID Connect库类似的情况,该库以前在Microsoft.IdentityModel.Protocol.Extensions包中(取决于JWT包的4.0.2),但现在是Microsoft.IdentityModel.Protocols.OpenIdConnect,它取决于2.0.0的Microsoft.IdentityModel.Protocols(取决于JWT软件包的5.0.0)。

删除任何Microsoft.IdentityModel*System.IdentityModel*软件包,并仅安装取决于System.IdentityModel.Tokens.Jwt的最新(5.0.0)Microsoft.IdentityModel.Tokens软件包。

您需要对这些 namespace 使用语句:

  • Microsoft.IdentityModel.Tokens(但不是System.IdentityModel.Tokens)
  • System.IdentityModel.Tokens.Jwt
  • System.Security.Claims

  • Microsoft简化了一些参数,使其更像您期望从其他平台的JWT库中获得的参数,因此SecurityTokenDescriptor属性有些不同:
    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),
    };
    

    注意SecurityAlgorithms.HmacSha256是“HS256”的字符串常量,就像您在其他大多数库中使用的一样。使用上面的代码以及问题中的示例,您应该能够生成有效的JWT。

    关于c# - 尝试使用.NET JWT库生成 token 时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38231321/

    10-10 04:09