当我们需要给我们的Web应用程序添加身份验证功能时,可以使用ASP.NET Core来实现,ASP.NET Core实现身份验证的主要方法是使用中间件,即Microsoft.AspNetCore.Authentication中的中间件。 在此,我将介绍如何使用ASP.NET Core来实现基本身份验证,并提供两个示例说明。
实现基本身份验证的示例代码
1. 添加NuGet包
首先,我们需要添加以下NuGet包:
- Microsoft.AspNetCore.Authentication
- Microsoft.AspNetCore.Authentication.Cookies
可以使用以下dotnet CLI命令添加:
dotnet add package Microsoft.AspNetCore.Authentication
dotnet add package Microsoft.AspNetCore.Authentication.Cookies
2. 配置认证服务
我们需要在Startup类中的ConfigureServices方法中添加如下代码来配置身份验证服务:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Account/Login";
options.AccessDeniedPath = "/Account/Forbidden";
});
services.AddMvc();
}
这里,我们注册了认证服务,并配置了Cookie认证中间件。在这个示例中,我们使用默认的CookieAuthenticationDefaults.AuthenticationScheme方案(即Cookie验证)。我们为服务和中间件提供了一些选项,以配置登录重定向到指定的链接,以及在需要时禁用访问的页面。
3. 配置中间件
我们需要在Startup类的Configure方法中添加如下代码来启用身份验证:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
app.UseRouting();
app.UseAuthentication(); // Enable authentication middleware
app.UseAuthorization();
// ...
}
这里,我们使用app.UseAuthentication()方法来启用身份验证中间件。
4. 添加认证属性
示例代码中的Account控制器类中添加Authorize属性即可实现基本的认证功能。在没有身份验证的情况下,如果尝试访问受保护的资源,ASP.NET Core会自动将他们重定向到登录页面,并在返回时设置cookie,以基于Cookies实现基本身份验证。
[Authorize]
public class AccountController : Controller
{
// ...
}
5. 添加登录和注销的操作
在Account控制器中,我们需要添加登录和注销的操作。下面是一个示例:
[AllowAnonymous]
public class AccountController : Controller
{
// ...
public IActionResult Login(string returnUrl = "/")
{
return View();
}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginModel loginModel, string returnUrl = "/")
{
if (!ModelState.IsValid)
{
return View(loginModel);
}
if (loginModel.Username == "admin" && loginModel.Password == "password")
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, loginModel.Username),
new Claim(ClaimTypes.Role, "Admin"),
};
var identity = new ClaimsIdentity(
claims, CookieAuthenticationDefaults.AuthenticationScheme);
var authProperties = new AuthenticationProperties
{
IsPersistent = loginModel.RememberMe,
};
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(identity),
authProperties);
return LocalRedirect(returnUrl);
}
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View(loginModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return RedirectToAction(nameof(Login));
}
}
在这个示例中,我们在Login方法中接收用户名和密码,如果正确,则使用ClaimsIdentity和ClaimsPrincipal创建身份验证cookie,并在HttpContext上使用HttpContext.SignInAsync方法设置cookie。在注销方法中,我们使用HttpContext.SignOutAsync方法来删除cookie。
6. 安全提示
当使用基本身份验证时,建议启用HTTPS以保护cookie中的数据。我们可以在Configure方法中启用HTTPS,方法如下:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
app.UseHsts(); // Enable HTTPS
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
// ...
}
在本例中,我们不必使用UseHttpsRedirection中间件,因为我们使用的是本机开发环境。
示例1:基于基本身份验证的API
我们可以创建一个基于API的Web应用程序,使用基本身份验证保护其中一些API端点。这是示例代码:
[Authorize]
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild",
"Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
在本例中,我们添加了[Authorize]属性来保护Get方法,这将要求客户端在访问API之前进行身份验证。如果客户端未能提供有效的凭据,则将重定向到登录页面以获取登录。
示例2:基于基本身份验证的MVC应用程序
我们可以创建一个基于MVC的Web应用程序,使用基本身份验证保护其中一些页面。这是示例代码:
[Authorize]
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
return View();
}
[AllowAnonymous]
public IActionResult Login(string returnUrl = "/")
{
return View();
}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginModel loginModel, string returnUrl = "/")
{
if (!ModelState.IsValid)
{
return View(loginModel);
}
if (loginModel.Username == "admin" && loginModel.Password == "password")
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, loginModel.Username),
new Claim(ClaimTypes.Role, "Admin"),
};
var identity = new ClaimsIdentity(
claims, CookieAuthenticationDefaults.AuthenticationScheme);
var authProperties = new AuthenticationProperties
{
IsPersistent = loginModel.RememberMe,
};
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(identity),
authProperties);
return LocalRedirect(returnUrl);
}
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View(loginModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return RedirectToAction(nameof(Login));
}
}
在本例中,我们为首页添加了[Authorize]属性,以保护只有经过身份验证的用户才能访问的页面。我们还添加了Login操作来提供登录页面,并添加了注销操作来删除cookie。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ASP.NET Core 实现基本认证的示例代码 - Python技术站