using AudioWallpaper.Entity; using AudioWallpaper.SSO; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AudioWallpaper { public class SSOManager { public readonly static String StorageDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\AudioWallpaper"; private static TokenManager _tokenManager = new TokenManager(new EncryptedFileTokenStore(StorageDirectory)); public static UserInfoSet? userInfoSet = null; public SSOManager() { AuthManager.Instance.OnLoginSuccess += OnLoginSuccess; AuthManager.Instance.OnLoginFailed += OnloginFailed; AuthManager.Instance.OnLogoutSuccess += OnLogoutSuccess; AuthManager.Instance.OnLogoutFailed += OnLogoutFailed; AuthManager.Instance.OnRevokeTokenSuccess += OnRevokeTokenSuccess; AuthManager.Instance.OnRevokeTokenFailed += OnRevokeTokenFailed; AuthManager.Instance.OnRefreshTokenSuccess += OnRefreshTokenSuccess; AuthManager.Instance.OnRefreshTokenFailed += OnRefreshTokenFailed; AuthManager.Instance.OnGetUserInfoSuccess += OnGetUserInfoSuccess; AuthManager.Instance.OnGetUserInfoFailed += OnGetUserInfoFailed; AuthManager.Instance.OnAuthStatusChanged += OnAuthStatusChanged; Console.WriteLine(StorageDirectory); } public async Task Initialize() { await ReLogin(); Console.WriteLine("sso初始化完成"); } #region 登录事件回调处理 /// /// 退出登录失败回调 /// /// 错误信息 private void OnLogoutFailed(string obj) { Console.WriteLine("登出失败:" + obj); } /// /// 退出登录成功回调 /// private void OnLogoutSuccess() { Console.WriteLine("登出成功"); //清除本地存储的令牌 _tokenManager.ClearToken(); if (SetFrom.setFrom == null) { return; } SetFrom.setFrom.ApplyModifications( new UIModification { ControlName = "P_NO_Login", PropertyName = "Visible", Value = true }, new UIModification { ControlName = "P_Login", PropertyName = "Visible", Value = false }, new UIModification { ControlName = "L_UserName", PropertyName = "Text", Value = string.Empty }, new UIModification { ControlName = "L_Welcome", PropertyName = "Text", Value = string.Empty } ); } /// /// 撤销令牌失败回调 /// /// 错误信息 private void OnRevokeTokenFailed(string obj) { Console.WriteLine("撤销令牌失败:" + obj); } /// /// 撤销令牌成功回调 /// private void OnRevokeTokenSuccess() { Console.WriteLine("撤销令牌成功"); //清除本地存储的令牌 _tokenManager.ClearToken(); } /// /// 刷新令牌失败回调 /// /// 失败信息 private void OnRefreshTokenFailed(string obj) { Console.WriteLine("刷新令牌失败:" + obj); //重新登录 //ReLogin(); } /// /// 刷新令牌成功回调 /// /// token内容 private void OnRefreshTokenSuccess(TokenSet set) { Console.WriteLine("令牌刷新成功:"); Console.WriteLine("AccessToken: " + set.AccessToken); Console.WriteLine("RefreshToken: " + set.RefreshToken); Console.WriteLine("IdToken: " + set.IdToken); //保存Token _tokenManager.SaveToken(set); AuthManager.Instance.GetUserInfo(set.AccessToken); Console.WriteLine($"登陆状态{AuthManager.Instance.AuthStatus}"); } /// /// 获取用户信息失败回调 /// /// 失败信息 private void OnGetUserInfoFailed(string obj) { Console.WriteLine("获取用户信息失败:" + obj); } /// /// 获取用户信息成功回调 /// /// 用户信息 private void OnGetUserInfoSuccess(UserInfoSet set) { Console.WriteLine("获取用户信息成功:"); userInfoSet = set; _tokenManager.SaveLoginMeta(new LoginMeta { IsLoggedIn = true, UserInfo = set }); // 更新登录状态 if (SetFrom.setFrom == null) { return; } SetFrom.setFrom.ApplyModifications( new UIModification { ControlName = "P_NO_Login", PropertyName = "Visible", Value = false }, new UIModification { ControlName = "P_Login", PropertyName = "Visible", Value = true }, new UIModification { ControlName = "L_UserName", PropertyName = "Text", Value = set.name }, new UIModification { ControlName = "L_Welcome", PropertyName = "Text", Value = $"欢迎回来,{userInfoSet.nickname}!" } ); } /// /// 登录成功回调 /// /// private void OnLoginSuccess(TokenSet set) { Console.WriteLine("登录成功"); Console.WriteLine("AccessToken: " + set.AccessToken); Console.WriteLine("RefreshToken: " + set.RefreshToken); Console.WriteLine("IdToken: " + set.IdToken); if (set != null && !string.IsNullOrWhiteSpace(set.AccessToken) && !string.IsNullOrWhiteSpace(set.RefreshToken) && !string.IsNullOrWhiteSpace(set.IdToken)) { //保存Token _tokenManager.SaveToken(set); //获取用户信息 AuthManager.Instance.GetUserInfo(set.AccessToken); } else { Console.WriteLine("TokenSet为空"); } } private void OnloginFailed(String error) { Console.WriteLine("登录失败"); Console.WriteLine(error); } private async Task ReLogin() { TokenSet? tokenSet = _tokenManager.GetToken(); if (tokenSet != null && !string.IsNullOrWhiteSpace(tokenSet.RefreshToken)) { Console.WriteLine(tokenSet.RefreshToken); await AuthManager.Instance.RefreshToken(tokenSet.RefreshToken); } } /// /// 登录状态发生改变回调 /// /// 当前状态 /// private void OnAuthStatusChanged(AuthStatus status) { Console.WriteLine($"登录状态回调,当前状态{status}"); if (status == AuthStatus.Success) { AccAssManage.Instance?.UpdateLoginState(new LoginMeta() { IsLoggedIn = true, UserInfo = null }); } if(status == AuthStatus.LoginOut || status == AuthStatus.Failed) { AccAssManage.Instance?.UpdateLoginState(new LoginMeta() { IsLoggedIn = false, UserInfo = null }); } } #endregion #region 对外提供的方法 /// /// 获取用户访问令牌 /// /// 访问令牌,如果令牌不存在返回空字符串 public String? GetAccessToken() { var tokenSet = _tokenManager.GetToken(); if (tokenSet != null) { return tokenSet.AccessToken; } return string.Empty; } /// /// 获取用户刷新令牌 /// /// 刷新令牌,如果令牌不存在返回空字符串 public String? GetRefreshToken() { var tokenSet = _tokenManager.GetToken(); if (tokenSet != null) { return tokenSet.RefreshToken; } return string.Empty; } /// /// 获取用户ID令牌 /// /// ID令牌 public String? GetIdToken() { var tokenSet = _tokenManager.GetToken(); if (tokenSet != null) { return tokenSet.IdToken; } return string.Empty; } public void StartLogin(Form form) { AuthManager.Instance.Login(form); } public void Logout() { AuthManager.Instance.Logout(_tokenManager.GetToken()); } public void RefreshToken() { AuthManager.Instance.RefreshToken(_tokenManager.GetToken()?.RefreshToken); } public void GetUserInfo() { AuthManager.Instance.GetUserInfo(_tokenManager.GetToken()?.AccessToken); } public AuthStatus GetAuthStatus() { return AuthManager.Instance.AuthStatus; } public LoginMeta? GetLoginMeta() { return _tokenManager.GetLoginMeta(); } #endregion } }