@ -1,10 +1,6 @@
using System ;
using System.Net.Http ;
using System.Collections.Generic ;
using System.Linq ;
using System.Net.Http ;
using System.Net.Http.Headers ;
using System.Net.Http.Headers ;
using System.Net.Http.Json ;
using System.Net.Http.Json ;
using System.Security.Claims ;
using System.Text ;
using System.Text ;
using System.Threading.Tasks ;
using System.Threading.Tasks ;
using BlazorAdmin.JavaScript ;
using BlazorAdmin.JavaScript ;
@ -20,6 +16,12 @@ namespace BlazorAdmin.Services
private readonly HttpClient _ httpClient ;
private readonly HttpClient _ httpClient ;
private readonly ILocalStorageService _l ocalStorage ;
private readonly ILocalStorageService _l ocalStorage ;
private readonly IJSRuntime _ jSRuntime ;
private readonly IJSRuntime _ jSRuntime ;
public string ApiUrl = > Constants . GetApiUrl ( InDocker ) ;
public string WebUrl = > Constants . GetWebUrl ( InDocker ) ;
private static bool InDocker { get ; set ; }
public bool IsLoggedIn { get ; set ; }
public bool IsLoggedIn { get ; set ; }
public string UserName { get ; set ; }
public string UserName { get ; set ; }
@ -30,51 +32,33 @@ namespace BlazorAdmin.Services
_ jSRuntime = jSRuntime ;
_ jSRuntime = jSRuntime ;
}
}
public HttpClient GetHttpClient ( )
public async Task < HttpResponseMessage > HttpGet ( string uri )
{
{
return _ httpClient ;
return await _ httpClient . GetAsync ( $"{ApiUrl}{uri}" ) ;
}
}
public async Task < AuthResponse > LoginWithoutSaveToLocalStorage ( AuthRequest user )
public async Task < HttpResponseMessage > HttpDelete ( string uri , int id )
{
{
var jsonContent = new StringContent ( JsonConvert . SerializeObject ( user ) , Encoding . UTF8 , "application/json" ) ;
return await _ httpClient . DeleteAsync ( $"{ApiUrl}{uri}/{id}" ) ;
var response = await _ httpClient . PostAsync ( $"{Constants.API_URL}authenticate" , jsonContent ) ;
var authResponse = new AuthResponse ( ) ;
if ( response . IsSuccessStatusCode )
{
authResponse = await DeserializeToAuthResponse ( response ) ;
IsLoggedIn = true ;
}
return authResponse ;
}
}
public async Task < AuthResponse > Login ( AuthRequest user )
public async Task < HttpResponseMessage > HttpPost ( string uri , object dataToSend )
{
{
var jsonContent = new StringContent ( JsonConvert . SerializeObject ( user ) , Encoding . UTF8 , "application/json" ) ;
var content = ToJson ( dataToSend ) ;
var response = await _ httpClient . PostAsync ( $"{Constants.API_URL}authenticate" , jsonContent ) ;
var authResponse = new AuthResponse ( ) ;
if ( response . IsSuccessStatusCode )
return await _ httpClient . PostAsync ( $"{ApiUrl}{uri}" , content ) ;
{
}
authResponse = await DeserializeToAuthResponse ( response ) ;
await SaveTokenInLocalStorage ( authResponse ) ;
await SaveUsernameInLocalStorage ( authResponse ) ;
await SetAuthorizationHeader ( ) ;
UserName = await GetUsername ( ) ;
public async Task < HttpResponseMessage > HttpPut ( string uri , object dataToSend )
IsLoggedIn = true ;
{
}
var content = ToJson ( dataToSend ) ;
return authResponse ;
return await _ httpClient . PutAsync ( $"{ApiUrl}{uri}" , content ) ;
}
}
public async Task Logout ( )
public async Task Logout ( )
{
{
await _l ocalStorage . RemoveItemAsync ( "authToken" ) ;
await DeleteLocalStorage ( ) ;
await _l ocalStorage . RemoveItemAsync ( "username" ) ;
await DeleteCookies ( ) ;
await DeleteCookies ( ) ;
RemoveAuthorizationHeader ( ) ;
RemoveAuthorizationHeader ( ) ;
UserName = null ;
UserName = null ;
@ -95,35 +79,73 @@ namespace BlazorAdmin.Services
var username = await new Cookies ( _ jSRuntime ) . GetCookie ( "username" ) ;
var username = await new Cookies ( _ jSRuntime ) . GetCookie ( "username" ) ;
await SaveUsernameInLocalStorage ( username ) ;
await SaveUsernameInLocalStorage ( username ) ;
var inDocker = await new Cookies ( _ jSRuntime ) . GetCookie ( "inDocker" ) ;
await SaveInDockerInLocalStorage ( inDocker ) ;
await RefreshLoginInfo ( ) ;
await RefreshLoginInfo ( ) ;
}
}
public async Task < string > GetToken ( )
{
var token = await _l ocalStorage . GetItemAsync < string > ( "authToken" ) ;
return token ;
}
public async Task < UserInfo > GetTokenFromController ( )
{
return await _ httpClient . GetFromJsonAsync < UserInfo > ( "User" ) ;
}
public async Task < string > GetUsername ( )
{
var username = await _l ocalStorage . GetItemAsync < string > ( "username" ) ;
return username ;
}
public async Task < bool > GetInDocker ( )
{
return ( await _l ocalStorage . GetItemAsync < string > ( "inDocker" ) ) . ToLower ( ) = = "true" ;
}
private StringContent ToJson ( object obj )
{
return new StringContent ( JsonConvert . SerializeObject ( obj ) , Encoding . UTF8 , "application/json" ) ;
}
private async Task LogoutIdentityManager ( )
private async Task LogoutIdentityManager ( )
{
{
await _ httpClient . PostAsync ( "Identity/Account/Logout" , null ) ;
await _ httpClient . PostAsync ( "Identity/Account/Logout" , null ) ;
}
}
private async Task DeleteLocalStorage ( )
{
await _l ocalStorage . RemoveItemAsync ( "authToken" ) ;
await _l ocalStorage . RemoveItemAsync ( "username" ) ;
await _l ocalStorage . RemoveItemAsync ( "inDocker" ) ;
}
private async Task DeleteCookies ( )
private async Task DeleteCookies ( )
{
{
await new Cookies ( _ jSRuntime ) . DeleteCookie ( "token" ) ;
await new Cookies ( _ jSRuntime ) . DeleteCookie ( "token" ) ;
await new Cookies ( _ jSRuntime ) . DeleteCookie ( "username" ) ;
await new Cookies ( _ jSRuntime ) . DeleteCookie ( "username" ) ;
await new Cookies ( _ jSRuntime ) . DeleteCookie ( "inDocker" ) ;
}
}
private async Task SetLoginData ( )
private async Task SetLoginData ( )
{
{
IsLoggedIn = ! string . IsNullOrEmpty ( await GetToken ( ) ) ;
IsLoggedIn = ! string . IsNullOrEmpty ( await GetToken ( ) ) ;
UserName = await GetUsername ( ) ;
UserName = await GetUsername ( ) ;
InDocker = await GetInDocker ( ) ;
await SetAuthorizationHeader ( ) ;
await SetAuthorizationHeader ( ) ;
}
}
private async Task < AuthResponse > DeserializeToAuthResponse ( HttpResponseMessage response )
private void RemoveAuthorizationHeader ( )
{
var responseContent = await response . Content . ReadAsStringAsync ( ) ;
return JsonConvert . DeserializeObject < AuthResponse > ( responseContent ) ;
}
private async Task SaveTokenInLocalStorage ( AuthResponse authResponse )
{
{
await _l ocalStorage . SetItemAsync ( "authToken" , SaveTokenInLocalStorage ( authResponse . Token ) ) ;
if ( _ httpClient . DefaultRequestHeaders . Contains ( "Authorization" ) )
{
_ httpClient . DefaultRequestHeaders . Remove ( "Authorization" ) ;
}
}
}
private async Task SaveTokenInLocalStorage ( string token )
private async Task SaveTokenInLocalStorage ( string token )
@ -135,19 +157,6 @@ namespace BlazorAdmin.Services
await _l ocalStorage . SetItemAsync ( "authToken" , token ) ;
await _l ocalStorage . SetItemAsync ( "authToken" , token ) ;
}
}
private void RemoveAuthorizationHeader ( )
{
if ( _ httpClient . DefaultRequestHeaders . Contains ( "Authorization" ) )
{
_ httpClient . DefaultRequestHeaders . Remove ( "Authorization" ) ;
}
}
private async Task SaveUsernameInLocalStorage ( AuthResponse authResponse )
{
await _l ocalStorage . SetItemAsync ( "username" , SaveUsernameInLocalStorage ( authResponse . Username ) ) ;
}
private async Task SaveUsernameInLocalStorage ( string username )
private async Task SaveUsernameInLocalStorage ( string username )
{
{
if ( string . IsNullOrEmpty ( username ) )
if ( string . IsNullOrEmpty ( username ) )
@ -157,22 +166,13 @@ namespace BlazorAdmin.Services
await _l ocalStorage . SetItemAsync ( "username" , username ) ;
await _l ocalStorage . SetItemAsync ( "username" , username ) ;
}
}
public async Task < string > GetToken ( )
private async Task SaveInDockerInLocalStorage ( string inDocker )
{
var token = await _l ocalStorage . GetItemAsync < string > ( "authToken" ) ;
return token ;
}
public async Task < UserInfo > GetTokenFromController ( )
{
{
return await _ httpClient . GetFromJsonAsync < UserInfo > ( "User" ) ;
if ( string . IsNullOrEmpty ( inDocker ) )
}
{
return ;
public async Task < string > GetUsername ( )
}
{
await _l ocalStorage . SetItemAsync ( "inDocker" , inDocker ) ;
var username = await _l ocalStorage . GetItemAsync < string > ( "username" ) ;
return username ;
}
}
private async Task SetAuthorizationHeader ( )
private async Task SetAuthorizationHeader ( )
@ -181,52 +181,5 @@ namespace BlazorAdmin.Services
_ httpClient . DefaultRequestHeaders . Authorization = new AuthenticationHeaderValue ( "Bearer" , token ) ;
_ httpClient . DefaultRequestHeaders . Authorization = new AuthenticationHeaderValue ( "Bearer" , token ) ;
}
}
public IEnumerable < Claim > ParseClaimsFromJwt ( string jwt )
{
var claims = new List < Claim > ( ) ;
if ( string . IsNullOrEmpty ( jwt ) )
{
return claims ;
}
var payload = jwt . Split ( '.' ) [ 1 ] ;
var jsonBytes = ParseBase64WithoutPadding ( payload ) ;
var keyValuePairs = JsonConvert . DeserializeObject < Dictionary < string , object > > ( Encoding . UTF8 . GetString ( jsonBytes ) ) ;
keyValuePairs . TryGetValue ( ClaimTypes . Role , out object roles ) ;
if ( roles ! = null )
{
if ( roles . ToString ( ) . Trim ( ) . StartsWith ( "[" ) )
{
var parsedRoles = JsonConvert . DeserializeObject < string [ ] > ( roles . ToString ( ) ) ;
foreach ( var parsedRole in parsedRoles )
{
claims . Add ( new Claim ( ClaimTypes . Role , parsedRole ) ) ;
}
}
else
{
claims . Add ( new Claim ( ClaimTypes . Role , roles . ToString ( ) ) ) ;
}
keyValuePairs . Remove ( ClaimTypes . Role ) ;
}
claims . AddRange ( keyValuePairs . Select ( kvp = > new Claim ( kvp . Key , kvp . Value . ToString ( ) ) ) ) ;
return claims ;
}
private byte [ ] ParseBase64WithoutPadding ( string base64 )
{
switch ( base64 . Length % 4 )
{
case 2 : base64 + = "==" ; break ;
case 3 : base64 + = "=" ; break ;
}
return Convert . FromBase64String ( base64 ) ;
}
}
}
}
}