public IActionResult RunLogin([FromBody] UserLoginModel userLoginModel) { if (!ModelState.IsValid) { return(new JsonResult("IsValid")); } var userEntity = _userService.CheckUserLogin(userLoginModel); if (userEntity == null) { return(new JsonResult("用户名或密码错误")); } UserLoginResultModel resultModel = new UserLoginResultModel(); resultModel.AuthInfo = _userService.GenerateAuthInfo(userEntity); resultModel.UserName = userEntity.UserName; resultModel.UserId = userEntity.Id.ToString(); if (HttpContext.Request.Cookies.ContainsKey("RedirectUrl")) { resultModel.RedirectUrl = HttpContext.Request.Cookies["RedirectUrl"]; } CookieOptions cookieOptions = new CookieOptions() { Expires = DateTime.Now.AddDays(7) }; HttpContext.Response.Cookies.Append("UserId", resultModel.UserId, cookieOptions); HttpContext.Response.Cookies.Append("UserName", resultModel.UserName, cookieOptions); HttpContext.Response.Cookies.Append("AuthInfo", resultModel.AuthInfo, cookieOptions); return(new JsonResult(resultModel)); }
public async Task <ResultModel <UserLoginResultModel> > Login(UserLoginRequestModel requestModel) { var discoveryDocumentRequest = new DiscoveryDocumentRequest { Address = ApplicationConfig.IdentityServer.Url, Policy = new DiscoveryPolicy { RequireHttps = false } }; var client = new HttpClient(); DiscoveryResponse discoveryResponse = await client.GetDiscoveryDocumentAsync(discoveryDocumentRequest); if (discoveryResponse.IsError) { return(ResultModel <UserLoginResultModel> .Fail("连接认证服务器失败")); } TokenResponse tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest { Address = discoveryResponse.TokenEndpoint, ClientId = ClientType.Web.ToString(), ClientSecret = ApplicationConfig.IdentityServer.Secret, UserName = requestModel.Account, Password = requestModel.Password, Scope = ApplicationConfig.IdentityServer.Scope }); if (tokenResponse.IsError) { return(ResultModel <UserLoginResultModel> .Fail(tokenResponse.ErrorDescription)); } var result = new UserLoginResultModel(tokenResponse.Raw.JsonToObject <TokenResultModel>()); return(ResultModel <UserLoginResultModel> .Success(result, "登录成功")); }
/// <summary> /// 將資料讀取出來 /// </summary> /// <returns></returns> public async Task <UserLoginResultModel> ReadAsync() { string data = ""; data = await StorageUtility.ReadFromDataFileAsync("", MainHelper.資料主目錄, MainHelper.UserLoginAPIName); Item = JsonConvert.DeserializeObject <UserLoginResultModel>(data); if (Item == null) { Item = new UserLoginResultModel(); } return(Item); }
public async Task <ResultModel <UserLoginResultModel> > LoginByWeChatCode(WeChatMiniProgramLoginRequestModel requestModel) { var weChatAppletManager = new WeChatMiniProgramManager(ApplicationConfig.CYRecordBillWeChatConfig); string openID = weChatAppletManager.GetOpenIDByCode(requestModel.Code); try { TokenResponse tokenResponse = await IdentityClientHelper.GetTokenResponseAsync(openID, requestModel.NickName, LoginCategory.OpenID); if (tokenResponse.IsError) { return(ResultModel <UserLoginResultModel> .Fail(tokenResponse.ErrorDescription)); } var result = new UserLoginResultModel(tokenResponse.Raw.JsonToObject <TokenResultModel>()); return(ResultModel <UserLoginResultModel> .Success(result, "登录成功")); } catch (InvalidOperationException ex) { return(ResultModel <UserLoginResultModel> .Fail(ex.Message)); } }
/// <summary> /// 使用者身分驗證:登入 (使用 GET) /// </summary> /// <param name="account"></param> /// <param name="password"></param> /// <returns></returns> public async Task <APIResult> GetAsync(string account, string password) { using (HttpClientHandler handler = new HttpClientHandler()) { using (HttpClient client = new HttpClient(handler)) { try { #region 呼叫遠端 Web API string FooUrl = $"{MainHelper.UserLoginAPIUrl}"; HttpResponseMessage response = null; // Accept 用於宣告客戶端要求服務端回應的文件型態 (底下兩種方法皆可任選其一來使用) //client.DefaultRequestHeaders.Accept.TryParseAdd("application/json"); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // 這裡是要存取 Azure Mobile 服務必須要指定的 Header //client.DefaultRequestHeaders.Add("ZUMO-API-VERSION", "2.0.0"); #region 將帳號與密碼進行編碼 var byteArray = Encoding.ASCII.GetBytes($"{account}:{password}"); client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); #endregion #region 設定相關網址內容 var fooFullUrl = $"{FooUrl}"; #endregion response = await client.GetAsync(fooFullUrl); #endregion #region 處理呼叫完成 Web API 之後的回報結果 if (response != null) { if (response.IsSuccessStatusCode == true) { #region 狀態碼為成功 // 取得呼叫完成 API 後的回報內容 String strResult = await response.Content.ReadAsStringAsync(); fooAPIResult = JsonConvert.DeserializeObject <APIResult>(strResult, new JsonSerializerSettings { MetadataPropertyHandling = MetadataPropertyHandling.Ignore }); if (fooAPIResult.Success == true) { #region 讀取成功的回傳資料 Item = JsonConvert.DeserializeObject <UserLoginResultModel> (fooAPIResult.Payload.ToString(), new JsonSerializerSettings { MetadataPropertyHandling = MetadataPropertyHandling.Ignore }); var fooSystemStatusRepository = new SystemStatusRepository(); await fooSystemStatusRepository.ReadAsync(); fooSystemStatusRepository.Item.AccessToken = Item.AccessToken; await fooSystemStatusRepository.SaveAsync(); await SaveAsync(); #endregion } else { #region API 的狀態碼為 不成功 Item = new UserLoginResultModel(); fooAPIResult = new APIResult { Success = false, Message = fooAPIResult.Message, Payload = Item, }; #endregion } await SaveAsync(); #endregion } else { fooAPIResult = new APIResult { Success = false, Message = $"應用程式呼叫 API 發生異常{Environment.NewLine}錯誤代碼:{response.StatusCode}{Environment.NewLine}{response.ReasonPhrase}", TokenFail = false, Payload = null, }; } } else { fooAPIResult = new APIResult { Success = false, Message = "應用程式呼叫 API 發生異常", Payload = null, }; } #endregion } catch (Exception ex) { fooAPIResult = new APIResult { Success = false, Message = ex.Message, Payload = ex, }; } } } return(fooAPIResult); }
/// <summary> /// 使用者身分驗證:登入 (使用 POST) /// </summary> /// <param name="account"></param> /// <param name="password"></param> /// <returns></returns> public async Task <APIResult> PostAsync(string account, string password) { using (HttpClientHandler handler = new HttpClientHandler()) { using (HttpClient client = new HttpClient(handler)) { try { #region 呼叫遠端 Web API string FooUrl = $"{MainHelper.UserLoginAPIUrl}"; HttpResponseMessage response = null; // Accept 用於宣告客戶端要求服務端回應的文件型態 (底下兩種方法皆可任選其一來使用) //client.DefaultRequestHeaders.Accept.TryParseAdd("application/json"); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // 這裡是要存取 Azure Mobile 服務必須要指定的 Header client.DefaultRequestHeaders.Add("ZUMO-API-VERSION", "2.0.0"); #region 使用 FormUrlEncodedContent 產生要 Post 的資料 var fooUserLoginModel = new UserLoginModel() { Account = account, Password = password }; // 強型別用法 // https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/nameof Dictionary <string, string> formDataDictionary = new Dictionary <string, string>() { { nameof(fooUserLoginModel.Account), fooUserLoginModel.Account }, { nameof(fooUserLoginModel.Password), fooUserLoginModel.Password }, }; // https://msdn.microsoft.com/zh-tw/library/system.net.http.formurlencodedcontent(v=vs.110).aspx var formData = new FormUrlEncodedContent(formDataDictionary); #endregion #region 設定相關網址內容 var fooFullUrl = $"{FooUrl}"; #endregion response = await client.PostAsync(fooFullUrl, formData); #endregion #region 處理呼叫完成 Web API 之後的回報結果 if (response != null) { if (response.IsSuccessStatusCode == true) { #region 狀態碼為成功 // 取得呼叫完成 API 後的回報內容 String strResult = await response.Content.ReadAsStringAsync(); fooAPIResult = JsonConvert.DeserializeObject <APIResult>(strResult, new JsonSerializerSettings { MetadataPropertyHandling = MetadataPropertyHandling.Ignore }); if (fooAPIResult.Success == true) { #region 讀取成功的回傳資料 Item = JsonConvert.DeserializeObject <UserLoginResultModel> (fooAPIResult.Payload.ToString(), new JsonSerializerSettings { MetadataPropertyHandling = MetadataPropertyHandling.Ignore }); var fooSystemStatusRepository = new SystemStatusRepository(); await fooSystemStatusRepository.ReadAsync(); fooSystemStatusRepository.Item.AccessToken = Item.AccessToken; await fooSystemStatusRepository.SaveAsync(); await SaveAsync(); #endregion } else { #region API 的狀態碼為 不成功 Item = new UserLoginResultModel(); fooAPIResult = new APIResult { Success = false, Message = fooAPIResult.Message, Payload = Item, }; #endregion } await SaveAsync(); #endregion } } else { #region API 的狀態碼為 不成功 fooAPIResult = new APIResult { Success = false, Message = $"狀態碼:{response.StatusCode}{Environment.NewLine}{response.ReasonPhrase}", Payload = null, }; #endregion } #endregion } catch (Exception ex) { fooAPIResult = new APIResult { Success = false, Message = ex.Message, Payload = ex, }; } } } return(fooAPIResult); }