C#中如何从CefSharp EventArgs获取URL并提取OAuth2授权码
用CefSharp实现OAuth2授权码提取
方法一:通过Uri解析查询参数(和WebBrowser方式一致)
和你之前用WebBrowser的思路完全对齐,先把CefSharp返回的URL字符串转成Uri对象,再解析查询参数:
- 从事件参数中获取URL并转为Uri:
// 假设e是CefSharp事件(如FrameLoadEndEventArgs)的参数 string urlStr = e.Browser.FocusedFrame.Browser.Url; Uri authUri = new Uri(urlStr);
- 解析查询参数:
- .NET Framework项目:直接用
System.Web.HttpUtility.ParseQueryString
using System.Web; var queryParams = HttpUtility.ParseQueryString(authUri.Query); string authCode = queryParams["code"]; // 解码URL编码字符(比如把%2F转成/) authCode = HttpUtility.UrlDecode(authCode);
- .NET Core/.NET 5+项目:使用
QueryHelpers.ParseQuery(需先安装Microsoft.AspNetCore.WebUtilitiesNuGet包)
using Microsoft.AspNetCore.WebUtilities; var queryParams = QueryHelpers.ParseQuery(authUri.Query); if (queryParams.TryGetValue("code", out var codeValues)) { string authCode = codeValues.FirstOrDefault(); authCode = System.Net.WebUtility.UrlDecode(authCode); }
方法二:直接字符串匹配提取(适合参数位置固定的场景)
如果确认授权码始终在code=和&country=之间,也可以用正则表达式直接提取:
using System.Text.RegularExpressions; string urlStr = e.Browser.FocusedFrame.Browser.Url; // 匹配code=之后、&country=之前的所有字符 Match match = Regex.Match(urlStr, @"code=([^&]+)&country="); if (match.Success) { string authCode = match.Groups[1].Value; // 解码URL编码字符 authCode = System.Web.HttpUtility.UrlDecode(authCode); // .NET Framework // .NET Core环境用:authCode = System.Net.WebUtility.UrlDecode(authCode); }
注意事项
- 推荐在
FrameLoadEnd事件中处理,确保页面加载完成后URL已稳定;避免在Navigating事件中操作,此时URL可能还未更新。 - 必须对提取到的授权码做URL解码,比如示例中的
GB%2F解码后才是GB/,否则会影响后续换取token的流程。
内容的提问来源于stack exchange,提问作者Jim Borland
相关产品推荐
相关产品推荐

