Neighbourhood.omg.lol/CustomAuthenticationStateProvider.cs

71 lines
2.5 KiB
C#
Raw Normal View History

using Microsoft.AspNetCore.Components.Authorization;
using Neighbourhood.omg.lol.Models;
using System.Security.Claims;
namespace Neighbourhood.omg.lol {
public class CustomAuthenticationStateProvider : AuthenticationStateProvider {
public CustomAuthenticationStateProvider() {
}
public async Task Login(string token) {
await SecureStorage.SetAsync("accounttoken", token);
NotifyAuthenticationStateChanged(GetAuthenticationStateAsync());
}
public async Task Logout() {
SecureStorage.Remove("accounttoken");
NotifyAuthenticationStateChanged(GetAuthenticationStateAsync());
}
public override async Task<AuthenticationState> GetAuthenticationStateAsync() {
var identity = new ClaimsIdentity();
try {
var token = await SecureStorage.GetAsync("accounttoken");
if (token != null) {
var name = await SecureStorage.GetAsync("accountname");
var email = await SecureStorage.GetAsync("accountemail");
var addresses = await SecureStorage.GetAsync("accountaddresses");
RestService api = new RestService(token);
if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(email)) {
AccountResponseData? accountInfo = await api.AccountInfo();
if (accountInfo != null) {
name = accountInfo.Name;
email = accountInfo.Email;
}
}
if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(email)) {
if (string.IsNullOrEmpty(addresses)) {
AddressResponseList? addressList = await api.Addresses();
List<string> addressStrings = new List<string>();
if (addressList != null) foreach (var address in addressList) {
if (!address.Expiration.Expired && !string.IsNullOrEmpty(address.Address)) {
addressStrings.Add(address.Address);
}
}
addresses = string.Join(',', addressStrings);
}
if(!string.IsNullOrEmpty(addresses)) {
await SecureStorage.SetAsync("accountname", name);
await SecureStorage.SetAsync("accountemail", email);
await SecureStorage.SetAsync("accountaddresses", addresses);
}
var claims = new[] {
new Claim(ClaimTypes.Name, name),
new Claim(ClaimTypes.Email, email),
new Claim("addresses", addresses)
};
identity = new ClaimsIdentity(claims, "Server authentication");
}
}
}
catch (HttpRequestException ex) {
Console.WriteLine("Request failed:" + ex.ToString());
}
return new AuthenticationState(new ClaimsPrincipal(identity));
}
}
}