【问题标题】:Validation of an Azure AD Bearer Token in a Console Application在控制台应用程序中验证 Azure AD 不记名令牌
【发布时间】:2016-12-05 17:00:19
【问题描述】:

您可以找到大量示例,如何使用 JWT 不记名身份验证通过 Azure AD 保护 ASP.Net 应用程序。就像在 Startup 中添加一些关于 AAD 的信息一样简单,例如:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseJwtBearerAuthentication(new JwtBearerOptions
    {
        Authority = "https://login.windows.net/...",
        Audience = "...",
    });

    app.UseMvc();
}

这些示例没有任何问题,所有令牌验证魔术都发生在幕后,您不必关心它。但实际上我想知道如何验证除 ASP.Net 之外的 Azure AD 承载令牌,例如在控制台应用程序中。

在控制台应用程序中,我期望如下所示:

public static void Main(string[] args)
{
   string token = "...";

   JwtSecurityToken validatedJwtToken = validateJwtToken(token);
}

private static JwtSecurityToken validateJwtToken(string token)
{
    JwtSecurityToken jwtToken = new JwtSecurityToken(token)

    //
    // how to validate the AAD token?!
    //

    if(/* is valid */)
    {
        return jwtToken;
    }
    else
    {
        return null;
    }
}

很遗憾,我还没有找到一个可行的示例,但我无法想象这个问题没有简单的解决方案。任何建议都非常感谢!

【问题讨论】:

    标签: c# azure jwt bearer-token azure-active-directory


    【解决方案1】:

    找到了解决方案 - 基于https://github.com/Azure-Samples/active-directory-dotnet-webapi-manual-jwt-validation

    private const string AUDIENCE = "<GUID of your Audience>";
    private const string TENANT = "<GUID of your Tenant>";
    
    private static async Task<SecurityToken> validateJwtTokenAsync(string token)
    {
        // Build URL based on your AAD-TenantId
        var stsDiscoveryEndpoint = String.Format(CultureInfo.InvariantCulture, "https://login.microsoftonline.com/{0}/.well-known/openid-configuration", TENANT);
    
        // Get tenant information that's used to validate incoming jwt tokens
        var configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint);
    
        // Get Config from AAD:
        var config = await configManager.GetConfigurationAsync();
    
        // Validate token:
        var tokenHandler = new JwtSecurityTokenHandler();
    
        var validationParameters = new TokenValidationParameters
        {
            ValidAudience = AUDIENCE,
            ValidIssuer = config.Issuer,
            IssuerSigningTokens = config.SigningTokens,
            CertificateValidator = X509CertificateValidator.ChainTrust,
        };
    
        var validatedToken = (SecurityToken)new JwtSecurityToken();
    
        // Throws an Exception as the token is invalid (expired, invalid-formatted, etc.)
        tokenHandler.ValidateToken(token, validationParameters, out validatedToken);
    
        return validatedToken;
    }
    

    这只是原始基础,并且仅使用 net452 进行了测试。查看上面的链接以了解更多用法(例如,将 SigningTokens 缓存一段时间)。

    【讨论】:

    • 我无法从程序集“System.IdentityModel.Tokens.Jwt, Version=5.0.0.127, Culture=neutral, PublicKeyToken=31bf3856ad364e35”中加载类型“System.IdentityModel.DateTimeUtil”。运行上述代码时
    • 你用的是哪个框架?此示例代码仅使用 net452 进行了测试。我将在我的帖子中添加注释。
    • 在哪里可以获得 config.Issuer 和 config.SigningTokens?
    猜你喜欢
    • 1970-01-01
    • 2023-01-12
    • 2017-05-19
    • 2019-02-20
    • 2016-11-15
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多