如何手动验证微软登录提供者发出的JWT访问令牌?

2022-10-15 11:26:46标签apisecurityaccess-tokenasp.net-core-6.0
提问

我有一个Angular应用程序,让我们用微软和谷歌账户登录。一旦登录步骤结束,我就得到了一个访问令牌,它被发送到API进行验证,以确保应用程序的安全。这个API是一个ASP。net Core 6应用程序。 我成功地验证了由谷歌发出的访问令牌与下面的代码。但我需要对微软发出的访问令牌也是一样的。 我试图为微软的供应商找到相同的验证模式,但没有任何成功。这就是为什么我要求社区得到一些答案或帮助。 我发现了微软图形API和Azure的身份,但它给我带来了什么。 我找到了我的问题的答案。昨天,我认为微软可以做一些事情,比如googlejsonweb签名,我试图找到它。这是一个错误! 我意识到我可以用system。identity 。 token解码每个访问令牌。在https://jwt。io/library中发现的Jwt。 然后,我可以在public claimsprchtoken方法中读取这些令牌,然后编写我的验证逻辑:

builder.Services.AddAuthentication(x =>
    {
        x.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme;
        x.DefaultSignOutScheme = JwtBearerDefaults.AuthenticationScheme;
        x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        options.SecurityTokenValidators.Add(new MicrosoftTokenValidator()); // todo
        options.SecurityTokenValidators.Add(new GoogleTokenValidator());
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(appSettings.AccessTokenSecretKey)),
            ValidateIssuer = false,
            ValidateAudience = false,
            ValidIssuer = appSettings.AccessTokenValidIssuer,
            ValidAudience = appSettings.AccessTokenValidAudience
        };
    });

With Google things are easy with GoogleJsonWebSignature.ValidateAsync from using Google.Apis.Auth;

public class GoogleTokenValidator : ISecurityTokenValidator
    {
        private readonly JwtSecurityTokenHandler _tokenHandler;
        public GoogleTokenValidator()
        {
            _tokenHandler = new JwtSecurityTokenHandler();
        }
        public bool CanValidateToken => true;
        public int MaximumTokenSizeInBytes { get; set; } = TokenValidationParameters.DefaultMaximumTokenSizeInBytes;
        public bool CanReadToken(string securityToken)
        {
            return _tokenHandler.CanReadToken(securityToken);
        }
        public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
        {
            validatedToken = null;
            var payload = GoogleJsonWebSignature.ValidateAsync(securityToken, new GoogleJsonWebSignature.ValidationSettings()).Result; // here is where I delegate to Google to validate
            var claims = new List<Claim>
                {
                    new Claim(ClaimTypes.NameIdentifier, payload.Name),
                    new Claim(ClaimTypes.Name, payload.Name),
                    new Claim(JwtRegisteredClaimNames.FamilyName, payload.FamilyName),
                    new Claim(JwtRegisteredClaimNames.GivenName, payload.GivenName),
                    new Claim(JwtRegisteredClaimNames.Email, payload.Email),
                    new Claim(JwtRegisteredClaimNames.Sub, payload.Subject),
                    new Claim(JwtRegisteredClaimNames.Iss, payload.Issuer),
                };
            try
            {
                var principle = new ClaimsPrincipal();
                principle.AddIdentity(new ClaimsIdentity(claims, "Password"));
                return principle;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
    }

回答

var token = new JwtSecurityToken(securityToken);

▼版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说cuoshuo.com——程序员的报错记录

部分内容根据CC版权协议转载,如果您希望取消转载请发送邮件到cuoshuo8@163.com

辽ICP备19011660号-5