ASP.NET Core 实现基本认证的示例代码

当我们需要给我们的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技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • WPF如何自定义ProgressBar滚动条样式

    下面是” WPF如何自定义ProgressBar滚动条样式”的完整攻略。 1. 了解ProgressBar控件 在WPF中,ProgressBar控件常用于展示进度条,可以在控件中设置Value属性来表示进度的大小。而滚动条的显示效果是ProgressBar样式的一种形式,因此,我们可以通过自定义ProgressBar的样式来实现滚动条的效果。 2. 新建自…

    C# 2023年6月6日
    00
  • 用C#生成不重复的随机数的代码

    下面是关于使用C#生成不重复的随机数的完整攻略及示例: 生成不重复的随机数概述 在C#中生成随机数是很常见的需求,但如果要生成不重复的随机数则需要使用一些特殊的技巧。 首先,我们需要生成一个可重复的种子值seed。种子值可以用系统时间、Guid、随机数等值生成。可以使用new Random(seed)初始化Random对象来进行后续的随机数生成操作。 其次,…

    C# 2023年6月1日
    00
  • WinForm中DefWndProc、WndProc与IMessageFilter的区别

    WinForm是Windows Forms的缩写,是基于Windows的用户界面框架,提供了一个可视化的设计工具。在WinForm中,程序的窗口消息都是通过消息循环和窗口过程来处理的。其中DefWndProc、WndProc和IMessageFilter都是处理窗口消息的重要概念。接下来我将针对这三个概念进行详细讲解: DefWndProc DefWndPr…

    C# 2023年6月7日
    00
  • C#实现单例模式的多种方式

    C#实现单例模式的多种方式 单例模式是设计模式中的一种,指的是创建一个类的实例后,该类只允许创建一个实例,并且提供一个访问该实例的全局访问点。在很多场景下,单例模式被广泛使用,比如线程池、缓存、配置文件等等。 在C#中实现单例模式的方式比较多,下面就介绍一些常见的实现方式,分别是:懒汉式、饿汉式、静态构造器、枚举实现、双重锁定以及 .NET 4.0+ 中新增…

    C# 2023年6月6日
    00
  • C# SendKeys使用方法介绍

    C#中的SendKeys提供了一种模拟按键的方法。它可以被用于许多场合,例如在自动化测试中,或者模拟用户输入等方面。下面是该方法的使用方法介绍: SendKeys方法 public static void SendKeys(string keys); SendKeys方法可以将一系列符号或字符串发送到当前活动窗口。 参数 keys:要发送的符号或字符串。 示…

    C# 2023年6月7日
    00
  • C#中如何为枚举类型添加描述方法【小技巧】

    要为C#中的枚举类型添加描述方法,可以采用以下方法: 1.使用System.ComponentModel.DescriptionAttribute类 using System.ComponentModel; public enum Gender { [Description("男性")] Male, [Description("…

    C# 2023年6月6日
    00
  • c#基础系列之System.String的深入理解

    C#基础系列之System.String的深入理解 前言 String 是 C# 中的一个非常重要且常用的数据类型,使用频率很高。本文主要讲解 String 的定义、初始化、赋值、整体替换、部分替换、常见方法、比较方式、特殊字符的处理等。 定义和初始化 定义一个 String 变量,可以使用以下语法: string str; 这样定义的变量不会被初始化,其值…

    C# 2023年6月7日
    00
  • C#类的创建与初始化实例解析

    C# 是一种面向对象的编程语言,它的类是其最重要的组成单元。在 C# 中,类可以被定义为模板或蓝图,用来描述一个对象需要包含哪些属性和行为。本文将介绍如何创建和初始化 C# 类的实例,以及解析这些实例的一些常见方法。 创建 C# 类 要创建一个 C# 类,需要遵循以下步骤: 使用 class 关键字定义类的名称,如: public class MyClass…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部