You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6 MVC中自定义第三方登录(Login with XYZ)实现求助

实现.NET自定义第三方认证(Login with XYZ)的步骤

前提准备

  • 先在XYZ平台的开发者后台注册应用,获取Client ID和Client Secret,同时配置好回调地址(比如本地开发用https://localhost:5001/signin-xyz)。

1. 安装必要的NuGet包

打开项目的NuGet包管理器,安装Microsoft.AspNetCore.Authentication.OpenIdConnect,或者在终端执行命令:

dotnet add package Microsoft.AspNetCore.Authentication.OpenIdConnect

2. 配置认证服务(Program.cs)

在Program.cs的服务配置部分添加以下代码:

var builder = WebApplication.CreateBuilder(args);

// 添加认证服务
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = "Cookies";
    options.DefaultChallengeScheme = "XYZ";
})
.AddCookie("Cookies") // 使用Cookie保存登录状态
.AddOpenIdConnect("XYZ", options =>
{
    // XYZ平台的认证地址(对应OAuth2/OpenID Connect的授权端点)
    options.Authority = "https://auth.xyz.com";
    // 从开发者后台获取的Client ID
    options.ClientId = "你的XYZ Client ID";
    // 从开发者后台获取的Client Secret
    options.ClientSecret = "你的XYZ Client Secret";
    // 回调地址,必须和XYZ平台配置的一致
    options.CallbackPath = "/signin-xyz";
    // 请求的权限范围,根据XYZ平台要求填写,比如基础的身份信息、邮箱
    options.Scope.Add("openid");
    options.Scope.Add("profile");
    // 保存用户令牌到Cookie,方便后续调用XYZ平台接口
    options.SaveTokens = true;
    // 采用授权码模式(最常用的安全模式)
    options.ResponseType = "code";
});

// 添加MVC服务(如果是Razor Pages项目,替换为builder.Services.AddRazorPages())
builder.Services.AddControllersWithViews();

var app = builder.Build();

// 配置中间件,注意顺序:认证要在授权之前
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

// 启用认证和授权中间件
app.UseAuthentication();
app.UseAuthorization();

// 配置路由端点
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

3. 添加登录/注销功能

创建一个AccountController(MVC项目),或者在Razor Pages中添加对应逻辑:

public class AccountController : Controller
{
    // 触发第三方认证流程
    public IActionResult Login(string provider = "XYZ")
    {
        var redirectUrl = Url.Action("Index", "Home");
        var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
        return Challenge(properties, provider);
    }

    // 注销登录,清除Cookie和第三方平台的登录状态
    public async Task<IActionResult> Logout()
    {
        await HttpContext.SignOutAsync("Cookies");
        await HttpContext.SignOutAsync("XYZ");
        return RedirectToAction("Index", "Home");
    }
}

4. 前端添加登录按钮

在页面中添加登录/注销的交互元素:

@if (User.Identity.IsAuthenticated)
{
    <p>欢迎, @User.Identity.Name!</p>
    <a asp-action="Logout" asp-controller="Account">注销</a>
}
else
{
    <a asp-action="Login" asp-controller="Account" asp-route-provider="XYZ">Login with XYZ</a>
}

新手常见注意事项

  • 回调地址一致性:XYZ平台配置的回调地址必须和代码里CallbackPath完全一致,本地开发要注意端口号和HTTPS协议。
  • HTTPS强制要求:绝大多数第三方认证平台要求回调地址为HTTPS,本地开发可以直接使用.NET Core自带的HTTPS(启动项目时会自动生成开发证书)。
  • 权限范围申请:根据XYZ平台的文档,申请必要的Scope(比如要获取用户邮箱就添加email范围),避免因权限不足导致无法获取用户信息。
  • 错误排查:如果登录失败,可在appsettings.json中设置日志级别为Debug,查看详细错误信息,排查是否是Client ID/Secret错误、回调地址不匹配或权限配置问题。

内容的提问来源于stack exchange,提问作者kamran bajwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 15:27:20