2016-07-31 39 views
1

Sie können zahlreiche Beispiele zum Sichern einer ASP.Net-Anwendung mit Azure AD mithilfe der JWT-Bearer-Authentifizierung finden. Es ist so einfach, wie einige Informationen über Ihren AAD in Ihrer Startliste hinzufügen, wie:Validierung eines Azure AD-Bearer-Tokens in einer Konsolenanwendung

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

    app.UseMvc(); 
} 

Nichts ist falsch mit diesen Beispielen, all Token-Validation-Magic geschieht hinter den Kulissen, und Sie müssen sie nicht nehmen kümmere dich darum. Aber eigentlich möchte ich wissen, wie man einen Azure AD Bearer Token abgesehen von ASP.Net, z.B. in einer Konsolenanwendung.

Innerhalb einer Konsole-Anwendung, würde ich so etwas wie das folgende erwarten:

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; 
    } 
} 

Leider did't ich noch ein funktionierendes Beispiel gefunden, aber ich kann nicht vorstellen, dass es für dieses Problem keine einfache Lösung. Jeder Rat wird sehr geschätzt!

Antwort

2

eine Lösung gefunden - basierend auf https://github.com/Azure-Samples/active-directory-dotnet-webapi-manual-jwt-validation:

private const string AUDIANCE = "<GUID of your Audiance>"; 
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 = AUDIANCE, 
     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; 
} 

Dies ist nur die roh Basics und wurde getestet nur net452 verwenden. Sehen Sie sich den obigen Link zur weiteren Verwendung an (z. B. Caching der SigningTokens für eine bestimmte Zeit).

+0

Ich erhalte konnte nicht Typ 'System.IdentityModel.DateTimeUtil' aus Assembly 'System.IdentityModel.Tokens.Jwt, Version = 5.0.0.127, Kultur = neutral, PublicKeyToken = 31bf3856ad364e35' laden. Wenn der obige Code ausgeführt wird –

+0

Welchen Rahmen haben Sie verwendet? Dieser Beispielcode wurde nur mit net452 getestet. Ich werde eine Notiz in meinem Beitrag hinzufügen. – MrFiveT