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