新闻中心
C#如何实现OAuth 2.0授权登录?集成第三方登录(如GitHub)到C#应用
答案:在ASP.NET Core中集成GitHub OAuth 2.0需先注册应用获取Client ID和Secret,再通过AspNet.Security.OAuth.GitHub包配置认证中间件,设置回调路径并请求用户权限,接着创建登录控制器触发Challenge流程,登录后利用HttpContext.AuthenticateAsync读取用户信息,并妥善处理登出;安全方面应避免硬编码凭据、使用HTTPS、依赖中间件防CSRF,实现简洁且符合标准的第三方登录。

要在C#应用中实现OAuth 2.0授权登录并集成第三方服务(如GitHub),核心是通过标准的OAuth 2.0流程获取用户授权,然后换取访问令牌(Access Token)来调用API。以下是基于ASP.NET Core的完整实现步骤,以GitHub为例。
注册应用并获取凭据
在使用GitHub OAuth前,需在GitHub上注册你的应用:
- 进入 GitHub Settings → Developer settings → OAuth Apps
- 点击“New OAuth App”,填写应用名称、主页URL和回调地址(如:https://localhost:5001/signin-github)
- 保存后获取 Client ID 和生成 Client Secret
在ASP.NET Core中配置GitHub OAuth
使用ASP.NET Core内置的身份验证中间件可轻松集成GitHub登录。
// 1. 安装NuGet包
确保项目已安装以下包:
- Microsoft.AspNetCore.Authentication.Google(非必须)
- 实际只需启用通用OAuth或使用社区库,但GitHub支持可通过通用OAuth实现
推荐使用 AspNet.Security.OAuth.GitHub 社区维护的库:
dotnet add package AspNet.Security.OAuth.GitHub
// 2. 在Program.cs中配置认证服务
在 Program.cs 中添加身份验证配置:
var builder = WebApplication.CreateBuilder(args);
<p>// 添加认证服务
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OAuthDefaults.DisplayName;
})
.AddCookie() // 使用Cookie存储登录状态
.AddGitHub(options =>
{
options.ClientId = "your-client-id";
options.ClientSecret = "your-client-secret";
options.CallbackPath = "/signin-github"; // 与GitHub注册的回调一致</p><pre class='brush:php;toolbar:false;'>// 可选:请求额外权限(如用户邮箱)
options.Scope.Add("user:email");});
处理登录与获取用户信息
配置完成后,通过控制器触发认证流程并读取用户信息。
CA.LA
第一款时尚产品在线设计平台,服装设计系统
94
查看详情
// 1. 创建登录入口
添加一个控制器用于发起登录:
public class AccountController : Controller
{
public IActionResult Login(string returnUrl = "/")
{
var props = new AuthenticationProperties
{
RedirectUri = returnUrl,
Items = { { "returnUrl", returnUrl } }
};
return Challenge(props, "GitHub");
}
<pre class='brush:php;toolbar:false;'>public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return Redirect("/");
}}
// 2. 获取用户信息
登录成功后,可在视图或控制器中访问用户信息:
@* 在Razor页面中 *@
@if (User.Identity.IsAuthenticated)
{
<p>欢迎, @User.Identity.Name!</p>
<form asp-controller="Account" asp-action="Logout" method="post">
<button type="submit">登出</button>
</form>
}
else
{
<a asp-controller="Account" asp-action="Login">使用GitHub登录</a>
}
你也可以从认证票据中提取更多信息,例如:
var info = await HttpContext.AuthenticateAsync(OAuthDefaults.DisplayName); if (info?.Principal != null) { var name = info.Principal.FindFirst(ClaimTypes.Name)?.Value; var email = info.Principal.FindFirst(ClaimTypes.Email)?.Value; // 处理用户逻辑,如创建本地账户 }
安全与最佳实践
- 将 ClientSecret 存储在安全位置(如
appsettings.json或环境变量),不要硬编码 - 启用HTTPS,OAuth回调必须通过安全连接
- 验证返回的
state参数防止CSRF攻击(中间件自动处理) - 根据需要映射用户信息到本地用户系统
基本上就这些。通过上述步骤,你可以让C# Web应用支持GitHub OAuth登录。整个流程遵循OAuth 2.0标准,清晰且易于维护。
以上就是C#如何实现OAuth 2.0授权登录?集成第三方登录(如GitHub)到C#应用的详细内容,更多请关注其它相关文章!
# 吴中seo推广工作
# 如何使用
# 最佳选择
# 身份验证
# 迭代
# 你可以
# 令牌
# 招远建设企业网站
# 三无网站seo优化
# 如何实现
# 网站推广问答
# 行唐网站推广服务
# 低价网站建设特征
# 母婴网站制作价格优化
# 公司网站建设要素
# 深圳网站建设论坛app
# 大型网站建设沈阳
# c#
# 回调
# 第三方
# 遍历
# micros
# 环境变量
# ai
# access
# app
# 编码
# cookie
# github
# go
# json
# git
# js
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性
58动漫网在线官方网 58动漫网正版动漫入口网址
BetterDiscord插件中安全更新用户简介的实践指南
网站内容防复制粘贴的实现策略与局限性
MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏
mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析
J*a最大堆Heapify方法修复:索引计算与边界条件深度解析
期待已久:小米17 Ultra、小米首款NAS本月登场
钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧
如何使用Node.js csv 包按条件移除含空字段的CSV记录
Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程
Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换
126邮箱网页版官方入口 126邮箱账号在线登录平台
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用
Flexbox布局实践:实现粘性导航栏与底部固定页脚
excel怎么制作工资条 excel快速生成工资条的方法
sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置
Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】
C++如何实现单例模式_C++设计模式之线程安全的单例写法
蛙漫移动版在线看 蛙漫手机浏览器直达入口
excel如何生成目录 excel一键生成工作表目录超链接
妖精动漫免费平台 妖精动漫官网资源观看网址
处理嵌套交互式控件:前端可访问性指南
使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战
Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求
C#中解析不规范的HTML为XML 常见的坑与解决办法
怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】
CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
将HTML Canvas内容转换为可上传的图像文件(File对象)
在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略
Golang如何优雅处理error_Golang error处理最佳实践总结
Excel Power Pivot如何处理XML数据源 构建高级数据模型
c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换
Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南
html5 app怎么运行环境_配html5 app运行环境【教程】
将JSON对象数组转置为键值对列表的实用指南
多闪网页版在线观看免费入口_多闪官网访问入口
UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】
Lar*el 递归关系中排除指定分支的教程
利用Bokeh CustomJS动态控制DataTable列可见性
Android Studio计算器C键功能异常排查与修复教程
谷歌学术网站直达地址 谷歌学术搜索网页版一键进入
LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置
c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架
c++如何实现单例设计模式_c++线程安全的单例模式写法
高德地图公交到站提醒失败如何解决 高德提醒权限设置
vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法


2025-11-22
浏览次数:次
返回列表
incipal != null)
{
var name = info.Principal.FindFirst(ClaimTypes.Name)?.Value;
var email = info.Principal.FindFirst(ClaimTypes.Email)?.Value;
// 处理用户逻辑,如创建本地账户
}