AuthProvider.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using Microsoft.AspNetCore.Components.Authorization;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Net.Http;
  6. using System.Net.Http.Headers;
  7. using System.Net.Http.Json;
  8. using System.Security.Claims;
  9. using System.Threading.Tasks;
  10. using wispro.sp.share.webViewObject;
  11. namespace wispro.sp.webclient
  12. {
  13. //AuthProvider.cs
  14. public class AuthProvider : AuthenticationStateProvider
  15. {
  16. private readonly HttpClient HttpClient;
  17. public string UserName { get; set; }
  18. public AuthProvider(HttpClient httpClient)
  19. {
  20. HttpClient = httpClient;
  21. }
  22. public async override Task<AuthenticationState> GetAuthenticationStateAsync()
  23. {
  24. //这里获得用户登录状态
  25. var result = await HttpClient.GetFromJsonAsync<userToken>($"http://localhost:39476/api/account/GetUser");
  26. if (result?.Name == null)
  27. {
  28. MarkUserAsLoggedOut();
  29. return new AuthenticationState(new ClaimsPrincipal());
  30. }
  31. else
  32. {
  33. var claims = new List<Claim>();
  34. claims.Add(new Claim(ClaimTypes.Name, result.Name));
  35. var authenticatedUser = new ClaimsPrincipal(new ClaimsIdentity(claims, "apiauth"));
  36. return new AuthenticationState(authenticatedUser);
  37. }
  38. }
  39. /// <summary>
  40. /// 标记授权
  41. /// </summary>
  42. /// <param name="loginModel"></param>
  43. /// <returns></returns>
  44. public void MarkUserAsAuthenticated(userToken userDto)
  45. {
  46. HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", userDto.Token);
  47. UserName = userDto.Name;
  48. //此处应该根据服务器的返回的内容进行配置本地策略,作为演示,默认添加了“Admin”
  49. var claims = new List<Claim>();
  50. claims.Add(new Claim(ClaimTypes.Name, userDto.Name));
  51. claims.Add(new Claim("Admin", "Admin"));
  52. var authenticatedUser = new ClaimsPrincipal(new ClaimsIdentity(claims, "apiauth"));
  53. var authState = Task.FromResult(new AuthenticationState(authenticatedUser));
  54. NotifyAuthenticationStateChanged(authState);
  55. //可以将Token存储在本地存储中,实现页面刷新无需登录
  56. }
  57. /// <summary>
  58. /// 标记注销
  59. /// </summary>
  60. public void MarkUserAsLoggedOut()
  61. {
  62. HttpClient.DefaultRequestHeaders.Authorization = null;
  63. UserName = null;
  64. var anonymousUser = new ClaimsPrincipal(new ClaimsIdentity());
  65. var authState = Task.FromResult(new AuthenticationState(anonymousUser));
  66. NotifyAuthenticationStateChanged(authState);
  67. }
  68. }
  69. }