要实现ASP.NET Core绑定IdentityUser的外部登录,而不使用Razor Pages,可以按照以下步骤进行操作:
步骤1: 添加必要的NuGet包 首先,确保已安装了以下NuGet包:
步骤2: 配置Identity 在Startup.cs文件的ConfigureServices方法中,添加以下代码来配置Identity服务:
services.AddDbContext(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
步骤3: 配置外部登录 在Startup.cs文件的ConfigureServices方法中,添加以下代码来配置外部登录服务:
services.AddAuthentication()
.AddGoogle(options =>
{
options.ClientId = Configuration["Google:ClientId"];
options.ClientSecret = Configuration["Google:ClientSecret"];
})
.AddFacebook(options =>
{
options.AppId = Configuration["Facebook:AppId"];
options.AppSecret = Configuration["Facebook:AppSecret"];
});
步骤4: 注册登录控制器 在Startup.cs文件的Configure方法中,添加以下代码来注册登录控制器:
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
步骤5: 创建登录视图 创建一个名为Login.cshtml的视图文件,包含以下代码:
Login
步骤6: 创建登录控制器 创建一个名为AccountController.cs的控制器文件,包含以下代码:
public class AccountController : Controller
{
private readonly SignInManager _signInManager;
private readonly UserManager _userManager;
public AccountController(SignInManager signInManager, UserManager userManager)
{
_signInManager = signInManager;
_userManager = userManager;
}
public IActionResult ExternalLogin(string provider)
{
var redirectUrl = Url.Action(nameof(ExternalLoginCallback));
var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
return Challenge(properties, provider);
}
public async Task ExternalLoginCallback()
{
var info = await _signInManager.GetExternalLoginInfoAsync();
if (info == null)
{
// 外部登录失败的处理逻辑
return RedirectToAction(nameof(Login));
}
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false);
if (result.Succeeded)
{
// 外部登录成功的处理逻辑
return RedirectToAction("Index", "Home");
}
// 外部登录成功,但未绑定到本地用户的处理逻辑
var email = info.Principal.FindFirstValue(ClaimTypes.Email);
var user = new IdentityUser
{
UserName = email,
Email = email
};
var createResult = await _userManager.CreateAsync(user);
if (createResult.Succeeded)
{
createResult = await _userManager.AddLoginAsync(user, info);
if (createResult.Succeeded)
{
await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false);
return RedirectToAction("Index", "Home");
}
}
// 创建用户或绑定失败的处理逻辑
return RedirectToAction(nameof(Login));
}
}
通过以上步骤,就可以实现ASP.NET Core绑定IdentityUser的外部登录,而不使用Razor Pages。请确保在appsettings.json文件中配置了正确的Google和Facebook API凭据。