ASP.NET身份核心(ASP.NET Identity Core)是一个开源的、可扩展的身份验证和授权框架,用于构建基于ASP.NET Core的Web应用程序。
自托管身份验证(Self-hosted Authentication)指的是在应用程序中自己实现身份验证逻辑,而不是依赖于框架提供的身份验证机制。
第三方身份验证提供者(Third-party Authentication Providers)是指使用第三方服务提供商(如Google、Facebook、Twitter等)的身份验证服务来进行用户身份验证。
下面是一个示例,演示了如何使用ASP.NET身份核心、自托管身份验证和第三方身份验证提供者来实现身份验证:
ASP.NET身份核心示例:
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores();
services.AddControllersWithViews();
services.AddRazorPages();
}
// HomeController.cs
public class HomeController : Controller
{
private readonly UserManager _userManager;
private readonly SignInManager _signInManager;
public HomeController(UserManager userManager, SignInManager signInManager)
{
_userManager = userManager;
_signInManager = signInManager;
}
public IActionResult Index()
{
return View();
}
[HttpPost]
public async Task Login(LoginViewModel model)
{
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(model.Username, model.Password, false, lockoutOnFailure: false);
if (result.Succeeded)
{
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
}
}
return View(model);
}
// Other actions and views...
}
自托管身份验证示例:
// HomeController.cs
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
[HttpPost]
public IActionResult Login(LoginViewModel model)
{
if (ModelState.IsValid)
{
// Your custom authentication logic here
if (IsValidUser(model.Username, model.Password))
{
// Authentication successful
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
}
}
return View(model);
}
// Other actions and views...
}
第三方身份验证提供者示例:
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication()
.AddGoogle(options =>
{
options.ClientId = Configuration["Authentication:Google:ClientId"];
options.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
})
.AddFacebook(options =>
{
options.AppId = Configuration["Authentication:Facebook:AppId"];
options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
})
.AddTwitter(options =>
{
options.ConsumerKey = Configuration["Authentication:Twitter:ConsumerKey"];
options.ConsumerSecret = Configuration["Authentication:Twitter:ConsumerSecret"];
});
services.AddControllersWithViews();
services.AddRazorPages();
}
// AccountController.cs
public class AccountController : Controller
{
public IActionResult ExternalLogin(string provider)
{
var redirectUrl = Url.Action(nameof(ExternalLoginCallback), "Account");
var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
return Challenge(properties, provider);
}
public async Task ExternalLoginCallback()
{
var info = await _signInManager.GetExternalLoginInfoAsync();
if (info == null)
{
// External authentication failed
return RedirectToAction("Login");
}
// External authentication succeeded
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
if (result.Succeeded)
{
return RedirectToAction("Index", "Home");
}
else
{
// New user, prompt for email
var email = info.Principal.FindFirstValue(ClaimTypes.Email);
return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = email });
}
}
// Other actions and views...
}