using BLL; using BLL.Common; using Microsoft.IdentityModel.Tokens; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Linq; using System.Text; using System.Web.Security; namespace FineUIPro.Web { public partial class ssocallback : System.Web.UI.Page { private string code = string.Empty; protected void Page_Load(object sender, EventArgs e) { this.code = Request.Params["code"]; //BLL.ErrLogInfo.WriteLog($"获取code={this.code}"); if (string.IsNullOrEmpty(this.code)) { Response.Redirect("~/login.aspx"); return; } var token = GetAccessToken(this.code); var userInfo = getUserInfo(token); if (userInfo == null) { Response.Redirect("~/login.aspx"); return; } Response.Redirect("~/index.aspx"); } private AccessTokenModel GetAccessToken(string _code) { string clientId = Funs.ClientId; string clientSecret = Funs.ClientSecret; string redirect_url = Funs.Redirect_url; string grant_type = "authorization_code"; string scope = "profile openid"; string baseUrl = $"https://login.microsoftonline.com/ecaa386b-c8df-4ce0-ad01-740cbdb5ba55/oauth2/v2.0/token"; try { string postData = $"code={code}&client_id={clientId}&client_secret={clientSecret}&grant_type={grant_type}&redirect_uri={redirect_url}&scope={scope}"; //BLL.ErrLogInfo.WriteLog($"请求参数postData={postData}"); string result = BLL.Common.HttpHelper.PostJsonByHttps(baseUrl, postData); //BLL.ErrLogInfo.WriteLog($"请求API Result={result}"); var Data = JsonConvert.DeserializeObject(result); return Data; } catch (Exception ex) { ErrLogInfo.WriteLog(ex.Message); } return null; } private Model.Sys_User getUserInfo(AccessTokenModel token) { try { string username = string.Empty; string[] toke_split= token.id_token.Split('.'); var header = Encoding.UTF8.GetString(Base64UrlEncoder.DecodeBytes(toke_split[0])); var clamis= Encoding.UTF8.GetString(Base64UrlEncoder.DecodeBytes(toke_split[1])); //BLL.ErrLogInfo.WriteLog("clamis=" + clamis); JObject jo = JObject.Parse(clamis); if (jo["cn"] != null) { username = jo["cn"].ToString(); } else { if (jo["preferred_username"] != null) { string preferred_username = jo["preferred_username"].ToString(); username = preferred_username.Split('@')[0]; } } var info = Funs.DB.Sys_User.Where(t => t.Account == username && t.IsPost == true).FirstOrDefault(); if (info != null) { FormsAuthentication.SetAuthCookie(username, false); Session[SessionName.CurrUser] = info; } return info; } catch (Exception ex) { //这里报错了,写入日志 BLL.ErrLogInfo.WriteLog(ex.Message); } return null; } } }