How to validate Azure AD security token?

后端 未结 3 1057
天涯浪人
天涯浪人 2020-11-27 14:09

The following code gives me Azure AD security token, I need to validate that token is valid or not. How to achieve this?

// Get OAuth token usin         


        
3条回答
  •  我在风中等你
    2020-11-27 15:00

    But if you are not using OWIN in your projects, it is going to be a little hard or at least time consuming.. This articleHere is great resource.

    And because I do not have much to add on the above, except the detailed code.. Here is something that can be useful to you:

     public async Task CreatePrincipleAsync()
        {
            AzureActiveDirectoryToken azureToken = Token.FromJsonString();
            var allParts = azureToken.IdToken.Split(".");
            var header = allParts[0];
            var payload = allParts[1];
            var idToken = payload.ToBytesFromBase64URLString().ToAscii().FromJsonString();
    
            allParts = azureToken.AccessToken.Split(".");
            header = allParts[0];
            payload = allParts[1];
            var signature = allParts[2];
            var accessToken = payload.ToBytesFromBase64URLString().ToAscii().FromJsonString();
    
            var accessTokenHeader = header.ToBytesFromBase64URLString().ToAscii().FromJsonString();
            var isValid = await ValidateToken(accessTokenHeader.kid, header, payload, signature);
            if (!isValid)
            {
                throw new SecurityException("Token can not be validated");
            }
            var principal = await CreatePrincipalAsync(accessToken, idToken);
            return principal;
        }
    
    
    
        private async Task ValidateToken(string kid, string header, string payload, string signature)
        {
            string keysAsString = null;
            const string microsoftKeysUrl = "https://login.microsoftonline.com/common/discovery/keys";
    
            using (var client = new HttpClient())
            {
                keysAsString = await client.GetStringAsync(microsoftKeysUrl);
            }
            var azureKeys = keysAsString.FromJsonString();
            var signatureKeyIdentifier = azureKeys.Keys.FirstOrDefault(key => key.kid.Equals(kid));
            if (signatureKeyIdentifier.IsNotNull())
            {
                var signatureKey = signatureKeyIdentifier.x5c.First();
                var certificate = new X509Certificate2(signatureKey.ToBytesFromBase64URLString());
                var rsa = certificate.GetRSAPublicKey();
                var data = string.Format("{0}.{1}", header, payload).ToBytes();
    
                var isValidSignature = rsa.VerifyData(data, signature.ToBytesFromBase64URLString(), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
                return isValidSignature;
            }
    
            return false;
        }
    

    There are some functions that I use in here that are not available for you, they are self descriptive.

提交回复
热议问题