.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)文章
菜渣開源一個基于?EMIT?的?AOP?庫(.NET?Core)的方法
CZGL.AOP?是?基于?EMIT?編寫的?一個簡單輕量的AOP框架,支持非侵入式代理,支持.NET?Core/ASP.NET?Core,以及支持多種依賴注入框架,本文介紹菜渣開源一個基于?EMIT?的?AOP?庫(.NET?Core)的相關(guān)知識,感興趣的朋友一起看看吧2024-06-06
.NET開發(fā)基礎(chǔ):從簡單的例子理解泛型 分享
.Net開發(fā)基礎(chǔ)系列文章,對自己之前寫過的代碼備忘,如能給人予幫助,不甚榮幸。個人能力有限,如有差錯或不足,請及時指正。2013-06-06
AJAX使用post發(fā)送數(shù)據(jù)xml格式接受數(shù)據(jù)
AJAX使用post發(fā)送數(shù)據(jù)xml格式接受數(shù)據(jù),需要的朋友可以參考一下2013-03-03
asp.net下利用JS實(shí)現(xiàn)對后臺CS代碼的調(diào)用方法
asp.net下利用JS實(shí)現(xiàn)對后臺CS代碼的調(diào)用方法...2007-04-04
ASP.NET 根據(jù)漢字獲取漢字拼音的首字母(含多音字)
本文分享了一個函數(shù),這個函數(shù)可以根據(jù)漢字的字符串獲取其拼音的首字母,以便我們在實(shí)際開發(fā)中使用。2016-04-04
Datalist控件使用存儲過程來分頁實(shí)現(xiàn)代碼
.net使用過程中,數(shù)據(jù)多的時候需要分頁,本文將介紹如何使用存儲過程來分頁,需要的朋友可以了解下2012-12-12
ASP.NET Core單文件和多文件上傳并保存到服務(wù)端的方法
這篇文章主要介紹了ASP.NET Core單文件和多文件上傳并保存到服務(wù)端的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

