无法从“Microsoft.IdentityModel.Tokens.SymmetricSecurityKey”转换为“Microsoft.IdentityModel.Tokens.SigningCredentials”

问题描述 投票:0回答:3

在学习教程时 使用 Web API 和 Jwt 创建具有身份验证的 RESTful API 我在编译

CustomJwtFormat
类时遇到问题:

using System.IdentityModel.Tokens;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.DataHandler.Encoder;
using Thinktecture.IdentityModel.Tokens;

namespace BooksAPI.Identity
{    
    public class CustomJwtFormat : ISecureDataFormat<AuthenticationTicket>
    {
        private static readonly byte[] _secret =              
             TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["secret"]);
        private readonly string _issuer;

        public CustomJwtFormat(string issuer)
        {
            _issuer = issuer;
        }

        public string Protect(AuthenticationTicket data)
        {
            if (data == null)
                throw new ArgumentNullException(nameof(data));

            var signingKey = new HmacSigningCredentials(_secret);
            var issued = data.Properties.IssuedUtc;
            var expires = data.Properties.ExpiresUtc;

            return new JwtSecurityTokenHandler().WriteToken(
               new JwtSecurityToken( _issuer, null, data.Identity.Claims,
                   issued.Value.UtcDateTime, expires.Value.UtcDateTime, signingKey));
        }

        public AuthenticationTicket Unprotect(string protectedText) {
            throw new NotImplementedException();
        }
    }
}

我遇到的构建错误是:

无法转换自 'Thinktecture.IdentityModel.Tokens.HmacSigningCredentials' 到 'Microsoft.IdentityModel.Tokens.SigningCredentials'

搜索后我发现了这个帖子:

ASP.NET v5 多重签名凭据

我已经尝试了答案帖子中的建议,但没有成功。我点击了链接:

不明确的参考问题(Microsoft.AspNet.Identity 和 Microsoft.AspNet.Identity.Core)

但我仍然看到冲突。我应该使用哪种包和命名空间组合?

asp.net-web-api oauth-2.0 asp.net-identity owin
3个回答
35
投票

原方法:

var signingKey = new HmacSigningCredentials(_secret);

新方法:

var securityKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(_secret);
var signingCredentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(
            securityKey,SecurityAlgorithms.HmacSha256Signature);
        //---
var issued = data.Properties.IssuedUtc;
var expires = data.Properties.ExpiresUtc;
var token = new JwtSecurityToken(_issuer, audienceId, data.Identity.Claims, issued.Value.UtcDateTime, expires.Value.UtcDateTime, signingCredentials);

22
投票

我遇到了同样的问题。 您必须使用旧版本的 System.IdentityModel.Tokens.Jwt。

打开 nuget 包管理器控制台并运行:

Install-Package System.IdentityModel.Tokens.Jwt -Version 4.0.2.206221351

0
投票

就我而言,这是因为有人更新到.NET 8,然后将 Microsoft.IdentityModel.Tokens 和 System.IdentityModel.Tokens 更新到不同的版本。在我花了一整天的时间拔头发后,将它们都更新到 7.5.1 解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.