AuthProvider.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using Blazored.LocalStorage;
  2. using Microsoft.AspNetCore.Components.Authorization;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IdentityModel.Tokens.Jwt;
  6. using System.Linq;
  7. using System.Net.Http;
  8. using System.Net.Http.Headers;
  9. using System.Net.Http.Json;
  10. using System.Security.Claims;
  11. using System.Threading.Tasks;
  12. using wispro.sp.share.webViewObject;
  13. using wispro.sp.web.Utils;
  14. namespace wispro.sp.web
  15. {
  16. //AuthProvider.cs
  17. public class AuthProvider : AuthenticationStateProvider
  18. {
  19. private readonly HttpClient HttpClient;
  20. private readonly ILocalStorageService localStorageService;
  21. public string UserName { get; set; }
  22. public AuthProvider(ILocalStorageService localStorageService, HttpClient httpClient)
  23. {
  24. this.localStorageService = localStorageService;
  25. HttpClient = httpClient;
  26. }
  27. public async override Task<AuthenticationState> GetAuthenticationStateAsync()
  28. {
  29. //var token = await localStorageService.GetItemAsync<string>("authToken");
  30. //var userName = await localStorageService.GetItemAsync<string>("authUserName");
  31. userToken result = new userToken();
  32. //if (string.IsNullOrEmpty(token))
  33. //{
  34. // //这里获得用户登录状态
  35. result = await HttpClient.GetFromJsonAsync<userToken>($"http://localhost:39476/api/account/GetUser");
  36. //}
  37. //else
  38. //{
  39. // result.Name = userName;
  40. // result.Token = token;
  41. //}
  42. if (result?.Name == null)
  43. {
  44. MarkUserAsLoggedOut();
  45. return new AuthenticationState(new ClaimsPrincipal());
  46. }
  47. else
  48. {
  49. var claims = new List<Claim>();
  50. claims.Add(new Claim(ClaimTypes.Name, result.Name));
  51. var authenticatedUser = new ClaimsPrincipal(new ClaimsIdentity(claims, "apiauth"));
  52. return new AuthenticationState(authenticatedUser);
  53. }
  54. }
  55. /// <summary>
  56. /// 标记授权
  57. /// </summary>
  58. /// <param name="loginModel"></param>
  59. /// <returns></returns>
  60. public async void MarkUserAsAuthenticated(userToken userDto)
  61. {
  62. HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", userDto.Token);
  63. UserName = userDto.Name;
  64. var claims = JwtParser.ParseClaimsFromJwt(userDto.Token);
  65. //JwtSecurityTokenHandler jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
  66. //JwtSecurityToken token = jwtSecurityTokenHandler.ReadJwtToken(userDto.Token);
  67. var authenticatedUser = new ClaimsPrincipal(new ClaimsIdentity(claims, "apiauth"));
  68. var authState = Task.FromResult(new AuthenticationState(authenticatedUser));
  69. NotifyAuthenticationStateChanged(authState);
  70. ////可以将Token存储在本地存储中,实现页面刷新无需登录
  71. await localStorageService.SetItemAsync<string>("authToken", userDto.Token);
  72. await localStorageService.SetItemAsync<string>("authUserName", userDto.Name);
  73. }
  74. /// <summary>
  75. /// 标记注销
  76. /// </summary>
  77. public async void MarkUserAsLoggedOut()
  78. {
  79. await localStorageService.RemoveItemAsync("authToken");
  80. await localStorageService.RemoveItemAsync("authUserName");
  81. HttpClient.DefaultRequestHeaders.Authorization = null;
  82. UserName = null;
  83. var anonymousUser = new ClaimsPrincipal(new ClaimsIdentity());
  84. var authState = Task.FromResult(new AuthenticationState(anonymousUser));
  85. NotifyAuthenticationStateChanged(authState);
  86. }
  87. }
  88. }