先随便贴点代码
1、WebApi_Net7使用Cookie
// 开启Cookie
using Microsoft.AspNetCore.CookiePolicy;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
using Microsoft.OpenApi.Models;
using System;
namespace fly_chat1_net7
{
public class Program
{
public static void Main(string[] args)
{
// try前也可能报错,但是错误是可控的。实际项目中使用时可以再加个try,只记录日志到文件中。
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory()) // 设置“configuration”的查找目录为程序目录
.AddJsonFile("appsettings.json") // 设置“configuration”的读取文件
.Build(); // 获取配置
var builder = WebApplication.CreateBuilder(args);
#region 容器Services
builder.Services.AddControllers(); // 添加Controller
builder.Services.AddHttpContextAccessor(); // 操作Http上下文;比如:AOP里面可以获取IOC对象
builder.Services.AddEndpointsApiExplorer(); // ASP.NET Core自身提供;Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
#region Cookie与Session
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) // 起用Cookie认证
builder.Services.AddCookiePolicy(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.Lax; // 限制只使用同站Cookie;Chrome 51 开始,浏览器的 Cookie 新增加了一个SameSite属性,用来防止 CSRF 攻击和用户追踪。SameSiteMode.Lax 允许 OAuth2身份验证,如Get请求;SameSiteMode.Strict 严格执行同一站点策略。
options.Secure = CookieSecurePolicy.None; // 标识Cookie是否必须是https。该属性在SameSite=None的场景下生效;CookieSecurePolicy.None为允许Https/Http,CookieSecurePolicy.Always为只允许Https;CookieSecurePolicy.SameAsRequest为登录页的URI是Https时则只允许Https,URI是Http时则允许Http/Https。
options.HttpOnly = HttpOnlyPolicy.None; // 是否只在Http请求中启用Cookie;默认为开启
options.CheckConsentNeeded = _ => true; // 检查用户是否位于欧盟(EU)或欧洲经济区(EEA);是则弹出一个页面让用户同意Cookie跟踪策略。默认是“false”
options.ConsentCookieValue = "true"; // 是否弹出一个页面让用户同意Cookie跟踪策略;默认为“是”。与CheckConsentNeeded类似。
options.ConsentCookie = new CookieBuilder() // options.CheckConsentNeeded或options.ConsentCookieValue弹出页面的内容
{
Name = configuration["AppName"], // Cookie名字
Expiration = TimeSpan.FromHours(6), // Cookie过期时间-6小时
MaxAge = TimeSpan.FromHours(6), // Cookie最大生命周期-6小时;Expiration与MaxAge如果同时使用,MaxAge会生效;推荐使用MaxAge。
IsEssential = false, // 是否可绕过"检查同意政策",默认为false不绕过
};
//options.OnAppendCookie = CheckSameCookie => { }; // cookie添加事件-记录Cookie变化或者检查是否有相同的Cookie
//options.OnDeleteCookie = AddCookieLog => { }; // cookie删除事件-记录Cookie变化
});
#endregion Cookie与Session
#endregion 容器Services
var app = builder.Build();
app.UseHttpLogging();
app.UseCookiePolicy(); // 启用Cookie
app.UseAuthorization();
app.MapControllers();
app.Run();
}
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
补充:options配置
① Name 默认为 SessionDefaults.CookieName (.AspNetCore.Session
)。
② Path 默认为 SessionDefaults.CookiePath (/
)。
③ SameSite 默认为 SameSiteMode.Lax (1
)。
④ HttpOnly 默认为 true
。 IsEssential 默认为 false
。
2、用户登录(Cookie+ ClaimsPrincipal序列化记录并验证用户身份信息)
public async Task<string> SignIn_CoookieAsync(string email,string password)
{
// Use Input.Email and Input.Password to authenticate the user
// with your custom authentication logic.
//
// For demonstration purposes, the sample validates the user
// on the email address maria.rodriguez@contoso.com with
// any password that passes model validation.
var user = await AuthenticateUser(email, password); // Authenticatede 认证方法
if (user == null)
{
return "登录失败!用户名或密码错误";
}
var claims = new List<Claim> // 维护用户信息
{
new Claim(ClaimTypes.Name, user.Email),
new Claim("FullName", user.FullName),
new Claim(ClaimTypes.Role, "Administrator"),
};
var claimsIdentity = new ClaimsIdentity( // claims添加到claimsIdentity
claims, CookieAuthenticationDefaults.AuthenticationScheme);
var authProperties = new AuthenticationProperties
{
//AllowRefresh = <bool>,
// Refreshing the authentication session should be allowed.
//ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10),
// The time at which the authentication ticket expires. A
// value set here overrides the ExpireTimeSpan option of
// CookieAuthenticationOptions set with AddCookie.
//IsPersistent = true,
// Whether the authentication session is persisted across
// multiple requests. When used with cookies, controls
// whether the cookie's lifetime is absolute (matching the
// lifetime of the authentication ticket) or session-based.
//IssuedUtc = <DateTimeOffset>,
// The time at which the authentication ticket was issued.
//RedirectUri = <string>
// The full path or absolute URI to be used as an http
// redirect response value.
};
await HttpContext.SignInAsync( // 执行登录操作;SignInAsync 将创建加密的 cookie 并将其添加到当前响应中
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
authProperties);
_logger.LogInformation("User {Email} logged in at {Time}.", // 记录调用日志
user.Email, DateTime.UtcNow);
return "登录成功!";
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
3、用户注销
作者:꧁执笔小白꧂