using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using xCommons.Configurations; using xCommons.Constants; using xCommons.Controllers; using xCommons.Extensions; using xCommons.Providers; using xExceptions.Constants; using xIdentityModels.Constants; using xIdentityModels.Models; using xIdentityService.Constants; using xIdentityService.Interfaces; namespace xIdentityService.Controllers { public abstract class XBaseIdentityController : XBaseController { // public IXIdentityProvider IdentityProvider { get; } protected XBaseIdentityController( ILogger logger, XAppConfiguration appConfiguration, IXIdentityProvider identityProvider, XValidationProvider validationProvider ) : base( logger, appConfiguration, validationProvider ) { IdentityProvider = identityProvider; } // #region NonActions ... /// /// Retrieve Connection ID for Hubs ... /// /// [NonAction] public string GetConnectionId() { // var result = ""; // var headerKey = XHeader.ConnectionId.GetStringValue(); // // Check if Connection ID is Provided ... if (Request.Headers.ContainsKey(headerKey)) { result = Request.Headers[headerKey]; } // return result; } /// /// Retrieve User Identifier Base on XActionRequest /// /// /// /// /// [NonAction] public string GetUserSelectByParam( XActionRequest model, bool forceNotNull = true, ICollection excludes = null ) { // // Validate Args ... ValidationProvider.NotNull(model); // var result = IdentityProvider.GetUserSelectByParam( model, forceNotNull, excludes ); // return result; } /// /// Retrieve Access Token /// /// [NonAction] public async Task GetAccessToken() { // var accessToken = Request.Headers[XAuthorization.Header].ToString(); if (accessToken.IsNullOrEmpty()) { // accessToken = await HttpContext .GetTokenAsync(XAuthorization.AccessToken); } // if (accessToken .ToNormalString() .Contains(XAuthorization.TokenIdentifier .ToNormalString())) { // accessToken = accessToken .Remove(0, XAuthorization.TokenIdentifier.Length); } // return accessToken; } /// /// Retrieve Refresh Token /// /// [NonAction] public async Task GetRefreshToken() { // var refreshToken = Request.Headers[XAuthorization.RefreshToken].ToString(); if (refreshToken.IsNullOrEmpty()) { // refreshToken = await HttpContext .GetTokenAsync(XAuthorization.RefreshToken); } // return refreshToken; } /// /// Retrieve Access Token Expiration Date /// /// [NonAction] public async Task GetTokenExpiresAt() { // var expiresAtStr = Request.Headers[XAuthorization.ExpiresAt].ToString(); if (expiresAtStr.IsNullOrEmpty()) { // expiresAtStr = await HttpContext .GetTokenAsync(XAuthorization.ExpiresAt); } // var expiresAt = expiresAtStr.ConvertTo(); // return expiresAt; } /// /// Retrieve All Required Tokens /// /// [NonAction] public async Task RetrieveTokensAsXLoginResponse() { // var accessToken = await GetAccessToken(); var refreshToken = await GetRefreshToken(); var expiresAt = await GetTokenExpiresAt(); // return new XLoginResponse { AccessToken = accessToken, RefreshToken = refreshToken, ExpiresAt = expiresAt }; } /// /// Retrieve All Required Tokens /// /// [NonAction] public async Task RetrieveTokensAsXTokenResponse() { // var accessToken = await GetAccessToken(); var refreshToken = await GetRefreshToken(); var expiresAt = await GetTokenExpiresAt(); // return new XTokenResponse { AccessToken = accessToken, RefreshToken = refreshToken, ExpiresAt = expiresAt }; } /// /// Retrive UserInfo /// /// [NonAction] public async Task GetUserInfo() { // var claims = User.Claims ?? null; if (!claims.HasChild()) { return null; } var xTokens = await RetrieveTokensAsXTokenResponse(); var result = new XUserClaimsInfoDto( xTokens.AccessToken, xTokens.RefreshToken, xTokens.ExpiresAt, User.Claims ); // return result; } /// /// Validate User Authenticated and Retrieve User Info /// /// [NonAction] public async Task ValidateAndGetUserInfo() { // if (!User.Identity.IsAuthenticated) { XException.NotAuthorized.Throw(); } // var result = await GetUserInfo(); if (result.IsNull()) { XException.NotAuthorized.Throw(); } // return result; } #endregion } }