asp.netcore系列之用户认证-给项目添加identity(代码片段)

vincent-yuan vincent-yuan     2022-12-02     512

关键词:

 

对于没有包含认证(authentication),的项目,你可以使用基架(scaffolder)把 Identity的程序集包加入到项目中,并且选择性的添加Identity的代码进行生成。

 

虽然基架已经生成了很多必须的代码,但是你仍然需要更新你的项目来完善这个过程。

这篇文章主要就是解释完善Identity基架进行更新的一些步骤

 

当Identity基架添加以后,一个ScaffoldingReadme.txt 文件就被创建了,这里面会包含一些完善Identity基架的说明。如下

ScaffoldingReadme.txt 


Support for ASP.NET Core Identity was added to your project 支持把ASP.NET Core Identity添加到你的项目里 - The code for adding Identity to your project was generated under Areas/Identity. 添加Identity生成的代码在Areas/Identity下面
关于Identity 相关的服务配置在Areas/Identity/IdentityHostingStartup.cs 中可以被找到 Configuration of the Identity related services can be found
in the Areas/Identity/IdentityHostingStartup.cs file. UI需要支持静态文件,可以在Configure方法中调用 app.UseStaticFiles() The generated UI requires support for static files. To add static files to your app: 1. Call app.UseStaticFiles() from your Configure method
要使用ASP.NET Core Identity,你还需要允许认证(authentication),可以在Configure方法中调用 app.UseAuthentication(),在调用静态文件之后做此设置 To use ASP.NET Core Identity you also need to enable authentication. To authentication to your app:
1. Call app.UseAuthentication() from your Configure method (after static files)
UI 要求MVC,可以通过在 Configure 方法中调用app.UseMvc(),在认证之后调用,
另外还需要在 ConfigureServices 中增加调用 services.AddMvc() The generated UI requires MVC. To add MVC to your app:
1. Call services.AddMvc() from your ConfigureServices method 2. Call app.UseMvc() from your Configure method (after authentication) Apps that use ASP.NET Core Identity should also use HTTPS. To enable HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.

 

这篇文章会提供更详细的说明

  • 把Identity基架添加到一个空项目
  • 把Identity基架添加到一个 不存在 认证(authentication)的  Razor项目(即项目中原来不存在认证的项目)
  • 把Identity基架添加到一个    存在  认证(authentication)的  Razor项目(即项目中原来存在认证的项目)
  • 把Identity基架添加到一个 不存在  认证(authentication)的 MVC项目(即项目中原来不存在认证的项目)
  • 把Identity基架添加到一个    存在   认证(authentication)的 MVC项目(即项目中原来存在认证的项目)
  • 创建一个完全的Identity UI (认证界面) 资源 

 

把Identity基架添加到一个空项目

1.首先,准备一个空项目

  • 文件->新建->项目
  • ASP.NET Core web应用,项目名EmptyForIdentity,确定
  • 选择空项目

操作如图:

技术图片

 

技术图片

技术图片

 

2.添加Identity基架

  • 在项目上右键,添加->新搭建基架的项目
  • 标识->添加

技术图片

 

 技术图片

 

然后,选择文件;

技术图片

 

 在这步,如果有布局页,可以选择现有的布局页;

这里没有没有布局页,也不需要指定一个新的布局页,就空着就可以了,它会自动生成一个新的布局页;

然后选择你需要的功能页面,这里选择的是登录功能页面,登录功能页面,注册功能页面;

再选择数据上下文,这里,如果存在的话,一样可以选择已经存在的;但是,在这个空项目中,是没有数据上下文的,所以这里直接点击加号,

新增一个即可。

 

点击添加

 

3.在StartUp文件类中,增加如下代码:

public class Startup
    
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        
       //新增的代码 services.AddMvc();
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        //注释的为空项目中原来的代码
//if (env.IsDevelopment()) // // app.UseDeveloperExceptionPage(); // //app.Run(async (context) => // // await context.Response.WriteAsync("Hello World!"); //); if (env.IsDevelopment()) app.UseDeveloperExceptionPage(); //引入异常中间件,捕获之后出现的异常 else app.UseHsts(); //不是必须添加的,但推荐添加,之后会专门讲解,待续
       //新增的代码 app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseAuthentication(); app.UseMvc();

注意,如果StartUp按照原来空项目的代码,去运行项目的话,像注册,登录,登出等功能页面不能显示,只打印 Hello world;

这里从前面ScaffoldingReadme.txt 文件的说明也能看到,UI的显示需要静态文件和MVC等

 

4.迁移到数据库

生成的Identity数据库代码需要用到Entity Framework Core Migrations(EFCore的迁移)来创建一个迁移,并更新到数据库

如下:

Add-Migration CreateIdentitySchema
Update-Database

CreateIdentitySchema这个名字可以自己随意取,但是最好能做到见名知义,知道做了哪些迁移

 

之后,可以自己打开vs上的sql server 对象资源管理器查看数据库和表是否生成成功;

 

5.运行,查看效果

技术图片

 

 

 

 这里,要说下这个路径了,为什么会是上图标示的这个路径呢

下面展示下目录结构,如下图:

技术图片

即区域(Areas)下的 Identity/Account/Login 

这里应该使用的是一种约定优先的路由方式,

这块之后可能会给出一篇讲解,这里先知道怎么找路由路径即可

 

注意,下面几个与第一个类似,就不再给出详细图示,可以自己按步骤操作,如果有需要,后面再补充

把Identity基架添加到一个 不存在 认证(authentication)的  Razor项目

1.首先,准备一个项目中原来不带认证的Razor项目

2.把Identity基架添加到项目中

  • 在项目上右键,添加->新搭建基架的项目
  • 标识->添加
  • 选择功能文件(类似登录,登出等),添加

这里操作同第一个,可以按需选择进行添加

3.迁移(Migrations),添加认证,布局

迁移

Add-Migration CreateIdentitySchema
Update-Database

 

允许认证

在StartUp文件的Configure方法中,在静态文件(UseStaticFiles)之后,调用 UseAuthentication 

public class Startup

    public Startup(IConfiguration configuration)
    
        Configuration = configuration;
    

    public IConfiguration Configuration  get; 

    public void ConfigureServices(IServiceCollection services)
    
        services.AddMvc();
    

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    
        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
        
        else
        
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseAuthentication(); //添加认证

        app.UseMvc();
    

 

布局变化

在布局页面(the layout file)中增加登录分页面(_LoginPartial)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - RazorNoAuth8</title>

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-page="/Index" class="navbar-brand">RazorNoAuth8</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-page="/Index">Home</a></li>
                    <li><a asp-page="/About">About</a></li>
                    <li><a asp-page="/Contact">Contact</a></li>
                </ul>
                <partial name="_LoginPartial" />
            </div>
        </div>
    </nav>

    <partial name="_CookieConsentPartial" />

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2018 - RazorNoAuth8</p>
        </footer>
    </div>

    <environment include="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha384-K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH+8Fk">
        </script>
        <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
                crossorigin="anonymous"
                integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
        </script>
        <script src="~/js/site.min.js" asp-append-version="true"></script>
    </environment>

    @RenderSection("Scripts", required: false)
</body>
</html>

 

 

把Identity基架添加到一个    存在  认证(authentication)的  Razor项目

1.首先准备一个项目中原来存在认证的项目

2.把Identity基架添加到项目中

  • 在项目上右键,添加->新搭建基架的项目
  • 标识->添加
  • 选择功能文件(类似登录,登出等),添加

注意,这里在选择布局这个页面操作时,你可以选择已经存在的布局哦,还有数据库上下文,也可以选择使用已经存在的,当然也可以新建

 

 

把Identity基架添加到一个 不存在  认证(authentication)的 MVC项目

1.首先准备项目中原来不存在认证的MVC项目

2.把Identity基架添加到项目中

  • 在项目上右键,添加->新搭建基架的项目
  • 标识->添加
  • 选择功能文件(类似登录,登出等),添加

 

把登录分页(_LoginPartial)添加到Views/Shared/_Layout.cshtml 中

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - MvcNoAuth3</title>

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-area="" asp-controller="Home" asp-action="Index" class="navbar-brand">MvcNoAuth3</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="About">About</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="Contact">Contact</a></li>
                </ul>
                <partial name="_LoginPartial" />
            </div>
        </div>
    </nav>

    <partial name="_CookieConsentPartial" />

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2018 - MvcNoAuth3</p>
        </footer>
    </div>

    <environment include="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha384-K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH+8Fk">
        </script>
        <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
                crossorigin="anonymous"
                integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
        </script>
        <script src="~/js/site.min.js" asp-append-version="true"></script>
    </environment>

    @RenderSection("Scripts", required: false)
</body>
</html>

 

然后,把 Pages/Shared/_LoginPartial.cshtml  移动到 Views/Shared/_LoginPartial.cshtml 位置

 

迁移

Add-Migration CreateIdentitySchema
Update-Database

 

添加认证

public class Startup


    public void ConfigureServices(IServiceCollection services)
    
        services.AddMvc();
    

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    
        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
        
        else
        
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseAuthentication();
        app.UseMvcWithDefaultRoute(); //使用mvc默认路由
    

 

把Identity基架添加到一个    存在   认证(authentication)的 MVC项目 

1.首先准备一个项目中原本存在认证(authentication)的MVC项目

2.把Identity基架添加到项目中

  • 在项目上右键,添加->新搭建基架的项目
  • 标识->添加
  • 选择功能文件(类似登录,登出等),添加

删除  Pages/Shared  下的文件,和这个目录

 

创建一个完全的Identity UI(认证界面)资源

下面的代码展示了对比默认Identity UI的一些变化,你可能会想对Identity UI更完全的控制。

public void ConfigureServices(IServiceCollection services)

    services.Configure<CookiePolicyOptions>(options =>
    
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    );

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<IdentityUser, IdentityRole>()
        // services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
        .AddRazorPagesOptions(options =>
        
            options.AllowAreas = true;
            options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
            options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
        );

  //这里设置了登录路径,登出路径,没权限访问的路径 services.ConfigureApplicationCookie(options
=> options.LoginPath = $"/Identity/Account/Login"; options.LogoutPath = $"/Identity/Account/Logout"; options.AccessDeniedPath = $"/Identity/Account/AccessDenied"; ); // using Microsoft.AspNetCore.Identity.UI.Services; 这里注册了一个IEmailSender邮件发送接口的实现 services.AddSingleton<IEmailSender, EmailSender>();

 

邮件实现的代码:

public class EmailSender : IEmailSender

    public Task SendEmailAsync(string email, string subject, string message)
    
        return Task.CompletedTask;
    

 

结束!

参考文档:

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-2.2&tabs=visual-studio#scaffold-identity-into-an-mvc-project-without-existing-authorization

 

docker系列之.netcore控制台和asp.netcore服务生成镜像(dockerfile)

通过DockerFile的方式来生成镜像,这个时候,镜像可以单独打包给对方,对方Docker加载了,就可以运行了。通过对控制台应用以及web服务应用一起举例,会更容易参考。新建控制台应用和web服务通过两种不同形... 查看详情

asp.netcore系列6实战之一个项目的完整结构(代码片段)

0.前言在《asp.netcore系列》之前的几篇文章中,我们简单了解了路由、控制器以及视图的关系以及静态资源的引入,让我们对于asp.netcoremvc项目有了基本的认识。不过,这些并不是asp.netcoremvc项目的全部内容,剩下的内容我将结合... 查看详情

asp.netcore框架探索之authentication(代码片段)

今天我们来探索一下ASP.NETCore中关于权限认证,所谓权限认证,就是通过某些方式获取到用户的信息。需要开启权限认证,我们首先需要在容器中注入认证服务,使用services.AddAuthentication。进入该方法的源码,最重要的其实就是Ad... 查看详情

asp.netcore系列48identity身份模型自定义(代码片段)

原文:asp.netcore系列48Identity身份模型自定义一.概述  ASP.NETCoreIdentity提供了一个框架,用于管理和存储在ASP.NETCore应用中的用户帐户。 Identity添加到项目时单个用户帐户选择作为身份验证机制。 默认情况下,Identity可以使... 查看详情

asp.netcore项目实战之权限管理系统无中生有

...发一个普通的权限管理系统的方式来从零体验和学习Asp.netCore。项目的整体规划大致如下:技术路线Asp.netCoreMvcEntityFrameworkCoreBootstrapAdminLTEPostgreSQL实现功能组织机构管理角色管理用户管理功能管理权限 查看详情

netcore项目实战之权限管理系统

...发一个普通的权限管理系统的方式来从零体验和学习Asp.netCore。项目的整体规划大致如下:技术路线Asp.netCoreMvcEntityFrameworkCoreBootstrapAdminLTEPostgreSQL实现功能组织机构管理角色管理用户管理功能 查看详情

netcore体系-web应用程序-4asp.netcore2.0项目实战-3项目架构说明(代码片段)

...4.总结1. 摘要  NCMVC角色权限管理框架是由最近练习NetCore时抽时间整理的系统,后续能不能发展成一个cms还要看朋友们是否有需要或时间是否充实。这里NCMVC主要还是给想要学习接触Asp.NetCore2.0的朋友们提供一些借鉴以及坑... 查看详情

.net平台系列6.netcore发展历程

参考技术A.NETCore历程以下内容来自微软.NET团队:【大约两年前,我们开始收到一些ASP.NET客户对于.NET在Linux系统上的请求。在同一时期,我们开始与WindowsServerTeam讨论关于WindowsNano,它们的未来和一些较小的服务型产品。结果,我... 查看详情

asp.netcore中identityserver4实战之claim详解(代码片段)

...多支持和关注。上几篇文章主要分享了IdentityServer4在Asp.NetCore3.x中的应用,在上面的几篇分享中有一部分博友问了我这么一个问题"他通过IdentityServer4来搭建授权中心网关服务,怎么才能在访问受保护的Api资源中获取到用户的... 查看详情

asp.netcore系列之允许跨域访问2之测试跨域(enablecross-originrequests:cors)(代码片段)

 这一节主要讲如何测试跨域问题 你可以直接在官网下载示例代码,也可以自己写,我这里直接使用官网样例进行演示样例代码下载:Cors 一.提供服务方,这里使用的是API1.创建一个API项目。或者直接下载样例代码2.像... 查看详情

asp.netcore系列之performance的responsecompression(响应压缩)(代码片段)

本文,帮助了解响应压缩的一些知识及用法(大部分翻译于官网,英文水平有限,不准确之处,欢迎指正)。什么是响应压缩?响应压缩简单的说就是为了减少网络带宽,而把返回的响应压缩,使之体积缩小,从而加快响应的一种技术(... 查看详情

asp.netcore系列之webapi集成dapper的简单操作教程(代码片段)

Dapper也是是一种ORM框架这里记录下,使用ASP.NET集成Dapper的过程,方便自己查看至于Dapper的特性以及操作可以参考Dapper官方文档 1.创建数据库相关在SqlServer创建一个叫做DapperDemo的数据库再创建一个叫做 Products的表脚本如下... 查看详情

asp.netcore之静态文件目录的操作

...也是新手,但我会努力的,希望大家多多支持小弟。asp.netcore项目静态文件  创建一个asp.netcore项目的静态文件一般是放在项目目录下wwwroot文件夹,文件目录如下。  如何将静态文件注入到项目中   在startup.cs文件的Config... 查看详情

asp.netcore2.0项目实战ncmvc一个基于netcore2.0搭建的角色权限管理开发框架(代码片段)

....总结 1. 摘要  NCMVC角色权限管理框架是由最近练习NetCore时抽时间整理的系统,后续能不能发展成一个cms还要看朋友们是否有需要或时间是否充实。这里NCMVC主要还是给想要学习接触Asp.NetCore2.0的朋友们提供一些借鉴以及坑... 查看详情

asp.netcore之静态文件目录的操作

...。但是我会努力的。希望大家能多多支持一下小弟。asp.netcore项目静态文件  创建一个asp.netcore项目的静态文件一般是放在项目目录下wwwroot文件夹,文件目录如下。  如何将静态文件注入到项目 查看详情

asp.netcore同时支持多种认证方式|swagger支持(代码片段)

前言上次,我们实现了《ASP.NETCore同时支持多种认证方式》:services.AddAuthentication()    .AddDemoAuthentication(options =>  )    .AddJwtBearer(options =>            ...    );我们还希望为Swagger也添加多种认证支 查看详情

认证授权方案之授权初识(代码片段)

...获取或执行目标资源操作的权限。本章就来介绍一下ASP.NETCore的授权系统的简单使用。2.说明授权与身份认证是相互独立,但是,授权却需要一种身份验证机制 查看详情

asp.netcore中简单session登录校验

ASP.NETCore中简单Session登录校验:从Session的配置添加、到请求过滤、再到页面操作。推荐相关阅读:ASP.NET会话状态概述 ASP.NETCookie概述 ASP.NET状态管理建议ASP.NETCore中的会话和应用状态目录添加Session配置服务启用Session配... 查看详情