.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
相关产品推荐
相关产品推荐

