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.Interfaces; namespace xIdentityService.Controllers { public abstract class XIBaseController : XBaseController { private readonly IXIdentityProvider identityProvider; public XIBaseController ( ILogger logger, XAppConfiguration appConfiguration, IXIdentityProvider identityProvider, XValidationProvider validationProvider ) : base ( logger, appConfiguration, validationProvider ) { this.identityProvider = identityProvider; } // #region User Handlers NonActions ... /// /// 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 } }