using IdentityDemo.Data;
using IdentityDemo.Models;
using IdentityDemo.Services;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
namespace IdentityDemo
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
// This method gets called by the runtime. Use this method to add services to the container.
//这个方法由运行时调用。使用此方法将服务添加到容器中。
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
//将给定上下文注册为服务。在应用程序(如ASP.NET)中使用依赖注入时使用此方法。
///public static IServiceCollection AddDbContext<TContext>(
///this IServiceCollection serviceCollection, Action<IServiceProvider, DbContextOptionsBuilder> optionsAction,
///ServiceLifetime contextLifetime = null)
///where TContext : DbContext
///类型参数:
///TContext 要注册的上下文类型。
///参数:
///serviceCollection 要添加到的服务。
///optionsAction 为上下文配置DBContextOptions的可选操作。这提供了通过在派生上下文中覆盖OnConfiguring(DBContextOptionsBuilder)方法来执行上下文配置的替代方法。
///如果这里提供了一个操作,如果在派生上下文中已经覆盖了OnConfiguring(DBContextOptionsBuilder)方法,那么它仍然会运行。
///除了在这里执行的配置之外,还将应用OnConfiguring(DBContextOptionsBuilder)配置。
///为了将选项传递到您的上下文中,您需要在您的上下文上公开一个构造函数,该构造函数接受DBContextOptions<TContest> 并将其传递给DbContext的基本构造函数。
///contextLifetime 在容器中注册DbContext服务的生存期。
///返回:
///相同的服务集合,以便可以链接多个调用。
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
//为指定的用户和角色类型添加默认标识系统配置。
///public static Microsoft.AspNetCore.Identity.IdentityBuilder AddIdentity<TUser,TRole> (
///this Microsoft.Extensions.DependencyInjection.IServiceCollection services)
///where TUser : class where TRole : class;
///类型参数:
///TUser 表示系统中用户的类型。
///TRole 表示系统中的角色的类型。
///返回
///用于创建和配置标识系统的IdentityBuilder。
//AddEntityFrameworkStores 添加标识信息存储的实体框架实现。
//AddDefaultTokenProviders 添加默认令牌提供程序,用于为重置密码、更改电子邮件和更改电话号码操作以及两个因素身份验证令牌生成生成令牌。
// 相对 AddSignInManager
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.Configure<IdentityOptions>(options =>
{
// Password settings
//获取或设置一个标志,该标志指示密码是否必须包含数字。默认值为true。
options.Password.RequireDigit = true;
//获取或设置密码必须的最小长度。默认为6。
options.Password.RequiredLength = 8;
//获取或设置一个标志,该标志指示密码是否必须包含非字母数字字符。默认值为true。
options.Password.RequireNonAlphanumeric = false;
//获取或设置一个标志,该标志指示密码是否必须包含大写ASCII字符。默认值为true。
options.Password.RequireUppercase = true;
//获取或设置一个标志,该标志指示密码是否必须包含小写ASCII字符。默认值为true。
options.Password.RequireLowercase = false;
//获取或设置密码必须包含的唯一字符的最小数目。默认为1。
options.Password.RequiredUniqueChars = 6;
// Lockout settings
//获取或设置用户在发生锁定时锁定的时间间隔。默认为5分钟。
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
//获取或设置在锁定用户之前允许的失败访问尝试的次数(假设锁定已启用)。默认为5。
options.Lockout.MaxFailedAccessAttempts = 10;
//获取或设置一个标志,该标志指示是否可以锁定新用户。默认值为true。
options.Lockout.AllowedForNewUsers = true;
// User settings
//获取或设置一个标志,该标志指示应用程序是否需要为其用户提供唯一的电子信箱。默认值为false。
options.User.RequireUniqueEmail = true;
//AllowedUserNameCharacters
//获取或设置用于验证用户名的用户名中允许的字符列表。默认为
//abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+
});
services.ConfigureApplicationCookie(options =>
{
// Cookie settings 定义用于创建cookie的设置。
//Domain 与cookie关联的域。
//IsEssential 指示此cookie是否对应用程序正确运行至关重要。如果为真,则可以绕过同意策略检查。默认值为false。
//MaxAge 获取或设置cookie的最大年龄。
//Name cookie的名字。
//Path cookie的
//SameSite cookie的SameSite属性。默认值是Lax (Lax:1;None:0;Strict:2 )
//SecurePolicy 将用于确定的策略。这是从传递给Build(HttpContext, DateTimeOffset)中确定的。
//指示客户端脚本是否可以访问cookie。
options.Cookie.HttpOnly = true;
//获取或设置cookie的寿命。
options.Cookie.Expiration = TimeSpan.FromDays(150);
//CookieAuthenticationOptions创建用默认值初始化的选项的实例.
//ClaimsIssuer 获取或设置应用于创建的任何声明的颁发者
//Cookie 确定用于创建cookie的设置。
//CookieManager 用于从请求中获取cookie或在响应中设置cookie的组件。默认情况下使用ChunkingCookieManager。
//DataProtectionProvider 如果设置此参数,CookieAuthenticationHandler将使用此参数进行数据保护。
//Events 提供者可以分配给应用程序在启动时创建的对象的实例。处理程序调用提供程序上的方法,这些方法在处理发生的某些点上为应用程序提供控制。如果没有提供,则提供一个默认实例,该实例在调用方法时不执行任何操作。
//EventsType 如果设置,将用作获取事件实例的服务类型,而不是属性。
//ExpireTimeSpan 控制存储在cookie中的身份验证票据从创建之日起保持有效的时间,过期信息存储在受保护的cookie票据中。
//因此,过期的cookie将被忽略,即使它是在浏览器应该清除它之后传递给服务器的。它与指定浏览器将保存cookie多长时间的值不同。
//ForwardAuthenticate 如果设置,则指定此模式应转发AuthenticateAsync调用到的目标模式。
//例如Context.AuthenticateAsync("ThisScheme") => Context.AuthenticateAsync("ForwardAuthenticateValue");将目标设置为当前模式以禁用转发并允许正常处理。
//ForwardChallenge 如果设置,则指定此模式应转发ChallengeAsync调用到的目标模式。
//例如Context.ChallengeAsync("ThisScheme") => Context.ChallengeAsync("ForwardChallengeValue");将目标设置为当前模式以禁用转发并允许正常处理。
//ForwardDefault 如果设置,则指定默认模式,身份验证处理程序在默认情况下应该将所有身份验证操作转发到该模式。
//默认转发逻辑将首先检查最特定的转发验证 /质疑/禁止/登录/退出设置,然后检查转发默认选择器,然后检查转发默认设置。第一个非空结果将用作转发的目标方案。
//ForwardDefaultSelector 用于为当前请求选择默认模式,默认情况下,身份验证处理程序应该将所有身份验证操作转发给该请求。
//默认转发逻辑将首先检查最特定的转发验证 /质疑/禁止/登录/退出设置,然后检查转发默认选择器,然后检查转发默认设置。第一个非空结果将用作转发的目标方案。
//ForwardForbid 如果设置,则指定此模式应转发禁止异步调用的目标模式。
//例如 Context.ForbidAsync("ThisScheme") => Context.ForbidAsync("ForwardForbidValue");将目标设置为当前模式以禁用转发并允许正常处理。
//ForwardSignIn 如果设置,则指定此模式应转发SignInAsync调用到的目标模式。
//例如Context.SignInAsync("ThisScheme") => Context.SignInAsync("ForwardSignInValue");将目标设置为当前模式以禁用转发并允许正常处理。
//ForwardSignOut 如果设置,则指定此模式应转发SignOutAsync调用到的目标模式。
//例如Context.SignOutAsync("ThisScheme") => Context.SignInAsync("ForwardSignOutValue");将目标设置为当前模式以禁用转发并允许正常处理。
// If the LoginPath isn't set, ASP.NET Core defaults
// the path to /Account/Login.
//LoginPath属性在处理ChallengeAsync时由处理程序用于重定向目标。作为查询字符串参数(由ReturnUrlParameter命名)添加到LoginPath中的当前url。
//一旦对LoginPath的请求授予新的登录标识,ReturnUrlParameter值将用于将浏览器重定向回原始url。
options.LoginPath = "/Account/Login";
//LogoutPath 如果处理程序提供了LogoutPath,那么对该路径的请求将基于ReturnUrlParameter重定向。
//ReturnUrlParameter ReturnUrlParameter确定查询字符串参数的名称,该参数由处理程序在查询期间追加。
//这也是当请求到达登录路径或注销路径时要查找的查询字符串参数,以便在执行操作后返回原始url。
//SessionStore 一个可选的容器,用于跨请求存储标识。使用时,只向客户机发送会话标识符。这可以用来缓解身份非常大的潜在问题。
// If the AccessDeniedPath isn't set, ASP.NET Core defaults
// the path to /Account/AccessDenied.
//当处理禁止异步时,处理程序使用AccessDeniedPath属性重定向目标。
options.AccessDeniedPath = "/Account/AccessDenied";
//slidingexpire设置为true,指示处理程序在处理超过过期窗口一半的请求时重新发出具有新过期时间的新cookie。
options.SlidingExpiration = true;
//TicketDataFormat TicketDataFormat用于保护和取消保护存储在cookie值中的标识和其他属性。如果没有提供,将使用DataProtectionProvider创建一个。
});
// Add application services.
//向IServiceCollection中添加服务的扩展方法。
//AddScoped 将serviceType中指定类型的作用域服务添加到指定的IServiceCollection。
//AddSingleton 将serviceType中指定类型的单例服务添加到指定的IServiceCollection中。
//AddTransient 将serviceType中指定类型的临时服务添加到指定的IServiceCollection中。
services.AddTransient<IEmailSender, EmailSender>();
//用于在IServiceCollection中设置MVC服务的扩展方法。
//将MVC服务添加到指定的IServiceCollection。
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
//这个方法由运行时调用。使用此方法配置HTTP请求管道。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//IHostingEnvironment的扩展方法。
//IsEnvironment 将当前宿主环境名称与指定值进行比较。
//IsProduction 检查当前宿主环境名称是否为生产环境。
//IsStaging 检查当前宿主环境名是否为Staging(预演)。
//IsDevelopment 检查当前宿主环境名称是否为Development。
if (env.IsDevelopment())
{
//从管道捕获同步和异步异常实例,并生成HTML错误响应。
app.UseDeveloperExceptionPage();
//调用此方法可在应用程序中启用浏览器链接。它注册一个工厂方法,为每个请求创建BrowserLinkMiddleware。
app.UseBrowserLink();
//从可以使用实体框架迁移解决的管道中捕获与数据库相关的同步和异步异常。
//当这些异常发生时,将生成一个HTML响应,其中包含解决问题的可能操作的详细信息。
app.UseDatabaseErrorPage();
}
else
{
//向管道中添加一个中间件,用于捕获异常、记录异常并在备用管道中重新执行请求。
//如果响应已经启动,则请求将不会重新执行。
app.UseExceptionHandler("/Home/Error");
}
//为当前请求路径启用静态文件服务
app.UseStaticFiles();
//将AuthenticationMiddleware添加到指定的IApplicationBuilder中,这将启用身份验证功能。
app.UseAuthentication();
//IApplicationBuilder将MVC添加到请求执行管道的扩展方法。
//UseMvcWithDefaultRoute 将MVC添加到IApplicationBuilder请求执行管道中,该管道具有名为“default”的默认路由和以下模板:“{controller=Home}/{action=Index}/{id?}”。
//UseMvc 将MVC添加到IApplicationBuilder请求执行管道中。
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}