繁体   English   中英

在控制台应用程序中验证Azure AD承载令牌

[英]Validation of an Azure AD Bearer Token in a Console Application

您可以找到大量示例,这些示例如何使用JWT承载身份验证使用Azure AD保护ASP.Net应用程序。 就像在启动中添加一些有关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;
    }
}

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

找到了一个解决方案-基于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进行了测试。 请查看上面的链接以进一步使用(例如,将SigningToken缓存一段时间)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM