新闻中心

C#如何实现OAuth 2.0授权登录?集成第三方登录(如GitHub)到C#应用

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

c#如何实现oauth 2.0授权登录?集成第三方登录(如github)到c#应用

要在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 CA.LA

第一款时尚产品在线设计平台,服装设计系统

CA.LA 94 查看详情 CA.LA

// 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手机互传视频详细传输方法 

搜索