开源博客项目Blog .NET Core源码学习(30:身份认证方式)

发布于:2024-11-29 ⋅ 阅读:(37) ⋅ 点赞:(0)

  学习了基于Cookie的身份认证方式,再回过头看看开源博客项目Blog中的身份认证,用的也是基于Cookie的身份认证。在项目启动文件(App.Hosting项目的program.cs)内调用AddAuthentication添加身份认证服务,并设置Cookie的部分属性(这里并没有设置登录/登出/访问拒绝时的路径)。

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options =>
{
    options.Cookie.Name = "appsoft";//cookie名称
    options.Cookie.HttpOnly = true;//不允许客户端获取
    options.SlidingExpiration = true;// 是否在过期时间过半的时候,自动延期
    options.ExpireTimeSpan = TimeSpan.FromHours(1);
});

  接着在Areas.Main.Controllers.LoginController的Login函数内,当用户账户通过验证后,调用App.Hosting.Extensions.HttpContextExtensions的Login函数,将用户对象实例(AuthUser)序列化为字符串,然后保存到类型为UserData的Claim对象内,最终被传入context.SignInAsync后保存到Cookie内。用户登出函数直接调用的context.SignOutAsync,在此不再赘述。

public static Task Login(this HttpContext context, AuthUser authUser)
{
    var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
    identity.AddClaim(new Claim(ClaimTypes.UserData, JsonConvert.SerializeObject(authUser)));
    return context.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity));
}

  在其它控制器类中获取当前用户信息时,调用App.Hosting.Extensions.HttpContextExtensions的GetAuthUser函数,其内从HttpContext.User属性中取出登录时序列化的用户信息字符串,将其反序列化为AuthUser对象实例,供其它处调用。

public static AuthUser GetAuthUser(this HttpContext context)
{
    var auth = context.User;
    if (auth.Identity != null && auth.Identity.IsAuthenticated)
    {
        string info = auth.Claims.FirstOrDefault()?.Value;
        return JsonConvert.DeserializeObject<AuthUser>(info);
    }
    return null;
}

  后台服务的权限控制没有使用 Authorize特性,而是自定义了AuthorizationAttribute类(App. Hosting.Filters),当访问标识了Authorization的后台服务时(定义了父类AdminControler,其标识了Authorization特性,所有的后台服务控制器类都继承此类),如果为通过身份认证,则返回后台服务登录页面,如果已通过后台服务,则局域当前访问路径及数据库中的用户访问权限设置判断是否有权限方式,有则继续访问,无则提示禁止访问。

参考文献:
[1]https://gitee.com/miss_you/Blog