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

.NET 7 Blazor:如何用MongoDB结合ASP.NET Core Identity实现社交登录

解决方案步骤

1. 安装所需NuGet包

先安装MongoDB适配ASP.NET Core Identity的包,以及Google认证包:

Install-Package MongoDB.AspNetCore.Identity
Install-Package Microsoft.AspNetCore.Authentication.Google

2. 定义自定义用户实体

创建继承自MongoIdentityUser的自定义用户类,添加你需要的额外业务字段:

using MongoDB.AspNetCore.Identity;

public class ApplicationUser : MongoIdentityUser
{
    // 示例额外字段:可根据你的需求修改
    public string PreferredTheme { get; set; } = "Light";
    public string LinkedGoogleId { get; set; }
}

3. 修改Program.cs配置

3.1 配置MongoDB连接信息

先在appsettings.json中添加MongoDB的连接配置(Docker环境下,连接字符串中的主机名改为Mongo容器名称,比如mongodb):

{
  "MongoDB": {
    "ConnectionString": "mongodb://mongodb:27017",
    "DatabaseName": "BlazorAuthDB"
  },
  "Authentication": {
    "Google": {
      "ClientId": "你的Google客户端ID",
      "ClientSecret": "你的Google客户端密钥"
    }
  }
}

3.2 替换Identity存储为MongoDB

将默认的SQL Server Identity服务替换为MongoDB版本:

var builder = WebApplication.CreateBuilder(args);

// 注册MongoDB Identity服务
builder.Services.AddMongoDbIdentity<ApplicationUser>(options =>
{
    // 社交登录场景下可弱化密码规则(因为无需本地账户注册)
    options.Password.RequireDigit = false;
    options.Password.RequireNonAlphanumeric = false;
    options.Password.RequireUppercase = false;
})
.AddDefaultTokenProviders();

// 绑定MongoDB配置
builder.Services.Configure<MongoDbSettings>(options =>
{
    options.ConnectionString = builder.Configuration["MongoDB:ConnectionString"];
    options.DatabaseName = builder.Configuration["MongoDB:DatabaseName"];
});

3.3 配置Google社交登录

添加Google OAuth认证逻辑,并处理用户信息映射:

builder.Services.AddAuthentication()
.AddGoogle(options =>
{
    options.ClientId = builder.Configuration["Authentication:Google:ClientId"];
    options.ClientSecret = builder.Configuration["Authentication:Google:ClientSecret"];
    
    // 映射Google返回的用户信息到Claim,后续可存入MongoDB
    options.ClaimActions.MapJsonKey("urn:google:picture", "picture", "url");
    options.Events.OnCreatingTicket = context =>
    {
        // 提取Google用户ID,后续关联到ApplicationUser
        var googleUserId = context.User.GetProperty("id").GetString();
        context.Principal.Identity.AddClaim(new Claim("LinkedGoogleId", googleUserId));
        return Task.CompletedTask;
    };
});

3.4 确保中间件顺序正确

认证和授权中间件必须按顺序放在路由之后:

var app = builder.Build();

// 其他中间件(静态文件、异常处理等)...

app.UseRouting();

// 先认证,再授权,顺序不能乱
app.UseAuthentication();
app.UseAuthorization();

// Blazor相关路由配置...
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();

4. 处理首次登录的用户数据填充

用户首次通过Google登录时,Identity会自动在MongoDB中创建ApplicationUser实例。如果需要在创建时填充额外字段,可在Blazor组件中通过UserManager更新:

@inject UserManager<ApplicationUser> UserManager
@inject AuthenticationStateProvider AuthStateProvider

private async Task SyncGoogleUserInfo()
{
    var authState = await AuthStateProvider.GetAuthenticationStateAsync();
    var currentUser = await UserManager.GetUserAsync(authState.User);
    if (currentUser != null && string.IsNullOrEmpty(currentUser.LinkedGoogleId))
    {
        var googleId = authState.User.FindFirstValue("LinkedGoogleId");
        currentUser.LinkedGoogleId = googleId;
        await UserManager.UpdateAsync(currentUser);
    }
}

5. Docker环境额外注意事项

  • 确保Mongo容器与Blazor应用容器在同一Docker网络下,这样才能通过容器名访问Mongo
  • 若Mongo配置了用户名密码,连接字符串需改为mongodb://用户名:密码@mongodb:27017
  • 首次启动时,Mongo会自动创建指定的数据库和用户集合,无需手动初始化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:05:22