.Net?Core實(shí)現(xiàn)第三方QQ掃碼登錄
效果展示:
核心實(shí)現(xiàn)
展示二維碼
public static (Stream, string) GetLoginQrCode() { var uri = new Uri(QrCodeUrl); var request = new HttpRequestMessage(HttpMethod.Get, uri); var cookieContainer = new CookieContainer(); var handler = new HttpClientHandler { CookieContainer = cookieContainer, AllowAutoRedirect = true, UseCookies = true }; using var client = new HttpClient(handler); var response = client.Send(request); var stream = response.Content.ReadAsStreamAsync().Result; var cookies = cookieContainer.GetCookies(uri).ToList(); var qrsig = cookies.FirstOrDefault(x => x.Name == "qrsig")?.Value; return (stream, qrsig); }
解析掃碼結(jié)果
public static (bool, string, ScanResult) GetQqScanResult(string qrsig) { var timeStamp = GetTimeStamp(); var ptqrToken = ParsePtqrToken(qrsig); var uri = new Uri(string.Format(ScanResultUrl, ptqrToken, timeStamp)); var request = new HttpRequestMessage(HttpMethod.Get, uri); var cookieContainer = new CookieContainer(); cookieContainer.Add(new Cookie("qrsig", qrsig) { Domain = uri.Host }); var handler = new HttpClientHandler { CookieContainer = cookieContainer, AllowAutoRedirect = true, UseCookies = true }; using var client = new HttpClient(handler); var response = client.Send(request); var content = response.Content.ReadAsStringAsync().Result; var result = ParsePtuiCbResult(content); return result[0] == "0" ? (true, result[4], new ScanResult(ParseQqNumber(result[2]), result[5])) : (false, result[4], null); }
登錄視圖
<h1>QQ Scan Login</h1> <img src="@Url.Action("QrCode")" width="350" alt="二維碼失效?點(diǎn)擊刷新" onclick="javascript:this.src += '?_t='+ Math.random();" style="cursor: pointer;" /> <h1>QQ Scan Result</h1> <textarea rows="3" cols="45" id="result"></textarea> <form asp-action="Login" method="post" id="loginForm"> <input type="hidden" name="nick" id="nickName" /> <input type="hidden" name="number" id="qqNumber" /> </form>
登錄授權(quán)
配置Cookie認(rèn)證策略
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { // options.Cookie.HttpOnly = true; // options.ExpireTimeSpan = TimeSpan.FromHours(2); // options.SlidingExpiration = true; options.LoginPath = "/Account/Login"; options.AccessDeniedPath = "/Account/Login"; });
不要忘記使用策略: app.UseAuthentication();
創(chuàng)建用戶登錄標(biāo)識
if (ModelState.IsValid) { // 創(chuàng)建用戶登錄標(biāo)識,Cookie名稱與IServiceCollection中配置的一樣即可 var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme); // 添加之后,可使用User.Identity.Name獲取該值 identity.AddClaim(new Claim(ClaimTypes.Name, model.Nick)); // identity中還可以添加自定義數(shù)據(jù) identity.AddClaim(new Claim("qq", model.Number)); // var customValue = User.Claims.SingleOrDefault(s => s.Type == "qq").Value; await HttpContext.SignInAsync(new ClaimsPrincipal(identity)); return Redirect("~/"); }
用戶退出登錄
await HttpContext.SignOutAsync();
代碼開源
https://github.com/Run2948/QQScanLogin
到此這篇關(guān)于.Net Core實(shí)現(xiàn)第三方QQ掃碼登錄的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
asp.net開發(fā)微信公眾平臺之驗(yàn)證消息的真實(shí)性
這篇文章主要介紹了asp.net開發(fā)微信公眾平臺之驗(yàn)證消息的真實(shí)性的相關(guān)資料,需要的朋友可以參考下2015-06-06asp.net Google的translate工具翻譯 API
很久前的一天,我想使用這個(gè)東西,然后看了下,GooGle的Translate工具目前沒有公開API,還是一個(gè)逐漸完善的過程,另一方面,利用一段很小的程序就可以得到我們想要的效果。2008-12-12合并網(wǎng)頁中的多個(gè)script引用實(shí)現(xiàn)思路及代碼
為了更好的進(jìn)行封裝,每個(gè)實(shí)現(xiàn)不同功能的js代碼應(yīng)該有自己的js文件,這樣如果一個(gè)網(wǎng)頁中引用了多個(gè)js文件會很難管理,所以就出現(xiàn)了合并js這以說,感興趣的朋友不妨參考下本文希望對你有所幫助2013-02-02asp.net core項(xiàng)目授權(quán)流程詳解
本文詳細(xì)講解了asp.net core項(xiàng)目的授權(quán)流程,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09asp.net 更改gridview pageSize的方法
asp.net 更改gridview pageSize的方法,需要的朋友可以參考下。2011-07-07