using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using xCommons.Constants; using xCommons.Extensions; using xIdentityModels.Models; using xIdentityService.Constants; namespace xIdentityService.Extensions { public static class HttpContextExtensions { /// /// Retrieve Authentication Service ... /// /// /// public static IAuthenticationService GetAuthenticationService (this HttpContext context) { // var result = context.RequestServices .GetRequiredService (); // return result; } /// /// Retrieve Specific Token from HttpContext ... /// /// /// /// /// public static async Task GetXTokenAsync ( this HttpContext context, string tokenName, XAuthenticationScheme scheme = XAuthenticationScheme.XToken ) { // // Validate Args ... if (tokenName.IsNullOrEmpty ()) { return null; } // var authService = context.GetAuthenticationService (); if (authService.IsNull ()) { return null; } // var authResult = await authService .AuthenticateAsync ( context, scheme .GetStringValue () ); // var result = authResult?.Properties? .GetTokenValue (tokenName); return result; } /// /// Retrieve Access Token /// /// public static async Task GetAccessToken (this HttpContext context) { // var accessToken = context.Request.Headers[XAuthorization.Header] .ToString (); if (accessToken.IsNullOrEmpty ()) { accessToken = await context .GetTokenAsync (XAuthorization.AccessToken); } // if (accessToken .ToNormalString () .Contains (XAuthorization.TokenIdentifier .ToNormalString ())) { accessToken = accessToken .Remove (0, XAuthorization.TokenIdentifier.Length); } // return accessToken; } /// /// Retrieve Refresh Token /// /// public static async Task GetRefreshToken (this HttpContext context) { // var refreshToken = context.Request.Headers[XAuthorization.RefreshToken] .ToString (); if (refreshToken.IsNullOrEmpty ()) { refreshToken = await context .GetTokenAsync (XAuthorization.RefreshToken); } // return refreshToken; } /// /// Retrieve Access Token Expiration Date /// /// public static async Task GetTokenExpiresAt (this HttpContext context) { // var expiresAtStr = context.Request.Headers[XAuthorization.ExpiresAt] .ToString (); if (expiresAtStr.IsNullOrEmpty ()) { expiresAtStr = await context .GetTokenAsync (XAuthorization.ExpiresAt); } // var expiresAt = expiresAtStr.ConvertTo (); // return expiresAt; } /// /// Retrieve All Required Tokens /// /// public static async Task RetrieveTokensAsXTokenResponse (HttpContext context) { // var accessToken = await GetAccessToken (context); var refreshToken = await GetRefreshToken (context); var expiresAt = await GetTokenExpiresAt (context); // return new XTokenResponse { AccessToken = accessToken, RefreshToken = refreshToken, ExpiresAt = expiresAt }; } } }