剖析 Microsoft.AspNetCore.Identity 的精髓 ——菜鸟入门

本文介绍了.Net Core Identity 的使用。先创建微软示例项目,分析其基于 Microsoft.EntityFrameworkCore 的 ORM 框架操作数据库的结构,找到用户相关的 DbSet。重点讲解了 Startup.cs 中的注入服务和默认 UI 注意事项。还说明了可通过构造函数获取 UserManager、RoleManager、SignInManager 服务来开始使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习目录

关于如何使用

博客园的童鞋们已经有很多这样的教程了,所以我就不用再这里班门弄斧咯,用最快的方式简单进行介绍。

我直接创建一个微软的示例项目和代码。
在这里插入图片描述
这个是 VS2019 的界面。

下图是 .Net Core 2.1+ 版本,微软已经把默认的细节封装起来了

在这里插入图片描述
这是简单的项目结构,默认是基于 Microsoft.EntityFrameworkCore 的 ORM 框架来操作数据库的。
我们先打开【Data -> Migrations -> ApplicationDbContext】这个文件。

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

微软已经定义好了一个可扩展的 DbContext 对象(不知道DbConext的戳这里,默认命名叫 ApplicationDbContext,当然根据需要你自己改就成了。

这里面没有任何 DbSet 属性或者相关的 EntityTypeConfiguretion 配置,那它的表结构是怎样的呢?我们对着 IdentityDbContext 按 【F12】进入到 代码的从元数据模式。
在这里插入图片描述
你发现它集成了 IdentityDbContext 基类,还定义了泛型的类型,IdentityUserIdentityRole 就是我们的实体了,当然通过名字也能知道一个是用户,一个是角色。

但还是没有 DbSet 属性,所以我们继续使用【F12】对着基类看下去。

在这里插入图片描述
终于看到了久违的 DbSet
在这里插入图片描述
我们发现了最后的 DbCotext 定义的都是用户相关的 DbSet。

所以,当你在使用 ApplicationDbContext 时,你就可以对用户和角色以及相关的 DbSet 进行操作了。

重点在 Startup.cs

在这里插入图片描述
主要关注的是第二个部分,通过调用的方法,我们看到了 AddDefaultIdentity<IdentityUser> 这个注入方式,这里面主要是对默认的类型进行注入服务,主要是包括了 UserManagerRoleManager 这两个类型,当然还有它们所需要的注入,请看下图:
在这里插入图片描述
这些在 UserManager 里的构造方法的参数,都需要注入相关服务,也是在 AddDefaultIdentity 里添加的,当然后期会详细说明。

再回来说下一个 AddDefaultUI,这个是干什么呢?还记得我们一开始说的吗?从 Core2.1+ 开始,微软把账号管理封装起来了,有兴趣可以自己去看源码。Github 源码地址:https://github.com/aspnet/Identity/tree/master/src/UI
当然,这里也有注释,告诉你怎么使用。
在这里插入图片描述

Adds a default, self-contained UI for Identity to the application using Razor Pages in an area named Identity.

翻译一下:添加默认的,包含了相关的 Razor 页面并放在了 area 下,命名为 Idenntity

还记得 Mvc 的 Area(区域)的概念吧?这个默认的 UI 在区域下,叫 Identity

在言论处,微软告诉你的注意事项

In order to use the default UI, the application must be using Microsoft.AspNetCore.Mvc, Microsoft.AspNetCore.StaticFiles and contain a _LoginPartial partial view that can be found by the application.

意思是:如果要启用默认 UI,你的应用程序必须使用 Mvc 和 StaticFiles 这个中间件,并且还要包含一个 _LoginPartial 这个分布视图。

根据上面的言论,我们可以在生成好的代码里,找找有没有提到的内容。

在这里插入图片描述
在这里插入图片描述
出于好奇,我们看看这个 _LoginPartial.cshtml 到底是个何方神圣.
在这里插入图片描述
其实就是一个判断,IsSignedIn 判断用户是否的登录,登录了就显示名字,没登录当然就显示【注册】【登录】这两个超链接咯。

如何开始使用

通过在构造函数中获取注入的服务就可以了。分别有三个:

  • UserManager
  • RoleManager
  • SignInManager

通过名称就能知道,UserManager 是对用户进行管理;RoleManager 则是针对角色;SignInManager 则是对登录和认证进行管理的。
具体的用法会在以后的章节继续说明,我这里就贴一小段示例代码来结束本章节的内容,也算是你入门了。

private readonly UserManager<IdentityUser> _userManageer;
public HomeController(UserManager<IdentityUser> userManager)
{
    _userManageer = userManager;
}

/// <summary>
/// 用 ajax 请求创建一个用户。
/// </summary>
/// <param name="userName">用户名。</param>
/// <param name="password">密码。</param>    
[HttpPost]
public async Task<IActionResult> CreateUserAsync(string userName, string password)
{
    var result = await _userManageer.CreateAsync(new IdentityUser { UserName = userName }, password);

    if (result.Succeeded)
    {
        return Json("创建成功");
    }

    return BadRequest(result.Errors);
}
### 关于StaticFileMiddleware WebRootPath未找到的问题 在.NET 8.0框架下,`Microsoft.AspNetCore.StaticFiles`中的`StaticFileMiddleware`用于提供静态文件服务。如果遇到`WebRootPath not found`错误,通常是因为应用程序未能正确配置静态文件路径。 以下是可能的原因以及解决方案: #### 原因分析 1. **默认目录缺失** 如果项目中缺少`wwwroot`目录或者该目录为空,则可能导致`WebRootPath`无法被识别[^3]。 2. **配置不完整** 需要在`Program.cs`或`Startup.cs`中显式启用并指定静态文件中间件的根路径。如果没有正确设置,默认会寻找名为`wwwroot`的目录作为静态资源存储位置[^4]。 3. **环境变量冲突** 当前运行环境中可能存在覆盖默认行为的自定义配置项,这可能会干扰到`WebRootPath`的实际解析逻辑[^5]。 --- #### 解决方案 ##### 方法一:确认是否存在 `wwwroot` 文件夹 确保项目的根目录下存在一个叫做`wwwroot`的文件夹,并且其中包含了需要访问的所有静态文件(如CSS、JavaScript和图片)。这是ASP.NET Core应用的标准约定,如果不遵循此结构则需手动调整路径映射关系[^6]。 ##### 方法二:修改启动代码以支持其他名称的空间 如果你不想使用标准命名方式即`wwwroot`,可以通过更改程序初始化部分来适应不同的需求。例如,在`.NET 8`环境下可以这样操作: ```csharp var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseWebRoot("custom_static"); // 设置新的web root path为 custom_static 文件夹 ``` 上述命令将把整个站点的基础URL指向至当前工作区下的子目录`custom_static/`之中而不是传统的`wwwroot/`[^7]。 ##### 方法三:注册模板标签库 (类比 Django 的做法) 虽然这不是严格意义上的 ASP .Net 中的做法,但从功能角度出发,类似于解决 Django 报错的方式之一是在 settings 或者 app configuration 添加额外的支持模块声明。对于 ASP.Net 来说,我们更多关注的是 middleware pipeline 构建过程而非 template engine 层面的内容处理。不过为了完整性起见还是给出相应示范代码片段如下所示: ```csharp app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "CustomFolder")), }); ``` 这里通过创建一个新的物理文件提供器实例指定了替代性的静态资产存放地点——假设它位于执行上下文中相对应的位置 `"./CustomFolder"` 下方[^8]。 --- ### 总结 综上所述,针对您提到的情况,“StaticFileMiddleware关于WebRootPath未找到”的主要原因是由于缺乏必要的基础架构准备或者是不当的应用级设定所引起。按照以上指导完成对应修正之后应该能够顺利解决问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我 Teacher 周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值