千家信息网

asp.net core的Identity身份验证怎么实现

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,本篇内容主要讲解"asp.net core的Identity身份验证怎么实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"asp.net core的Ide
千家信息网最后更新 2025年12月01日asp.net core的Identity身份验证怎么实现

本篇内容主要讲解"asp.net core的Identity身份验证怎么实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"asp.net core的Identity身份验证怎么实现"吧!

1. 身份验证

asp.net core的身份验证有 JwtBearer和Cookie两种常见的模式,在这一篇我们将启用Cookie作为身份信息的保存。那么,我们如何启用呢?

在Startup.cs 的ConfigureServices(IServiceCollection services) 方法里添加如下:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
Configuration.Bind("CookieSettings",options);
});

此时可以启动一个权限验证,当用户访问需要验证的页面或接口时,如果没有登录,则会自动跳转到:

https://localhost:5001/Account/Login?ReturnUrl=XXXX

其中ReturnUrl指向来源页。

1.1 设置验证

当我们在Startup类里设置启用了身份验证后,并不是访问所有接口都会被跳转到登录页面。那么如何设置访问的路径需要身份验证呢?asp.net core为我们提供了一个特性类:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class AuthorizeAttribute : Attribute, IAuthorizeData
{
public string Policy { get; set; }
public string Roles { get; set; }
public string AuthenticationSchemes { get; set; }
}

可以看的出,这个特性类允许设置在类、方法上,可以设置多个,允许子类继承父类的特性。所以可以在控制器上设置[Authorize],当在控制器上设置以后访问控制器里所有的Action都会要求验证身份;也可以单独设置在Action上,表示该Action需要验证身份,控制器里的其他方法不需要验证。

1.2 设置忽略

我们在开发过程中,会遇到这样的一组链接或者页面:请求地址同属于一个控制器下,但其中某个地址可以不用用户登录就可以访问。通常我们为了减少重复代码以及复用性等方面的考虑,会直接在控制器上设置身份验证要求,而不是在控制器里所有的Action上添加验证要求。

那么,我们如何放开其中的某个请求,可以允许它不用身份验证。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class AllowAnonymousAttribute : Attribute, IAllowAnonymous
{
}

仔细观察,可以看得出这个特性可以设置在类、方法上,不允许多次设置,允许子类继承父类的特性。

这个特性的使用没啥可说的,不过需要注意的是,不要与AuthorizeAttribute一起使用。虽然编译上没啥问题,但实际上会对程序员的逻辑照成一定程度的误导。

2.保存身份

有身份验证,就必然需要保存身份。当我们从数据库中或者其他的三方服务中获取到用户信息后,我们需要将用户信息保存起来,而不是每次都向用户或者服务提供方索求信息。

在asp.net core中,Controller类里有一个属性:

public HttpContext HttpContext { get; }

HttpContext 提供了一个扩展方法,可以用来保存用户信息:

public static Task SignInAsync(this HttpContext context, ClaimsPrincipal principal);

暂时忽略这个方法的返回类型,它接受了一个ClaimsPrincipal类型的参数。我们来看下这个类的基本情况吧:

public class ClaimsPrincipal : IPrincipal
{

public ClaimsPrincipal();
public ClaimsPrincipal(IEnumerable identities);
public ClaimsPrincipal(BinaryReader reader);
public ClaimsPrincipal(IIdentity identity);
public ClaimsPrincipal(IPrincipal principal);

public static ClaimsPrincipal Current { get; }
public static Func ClaimsPrincipalSelector { get; set; }
public static Func, ClaimsIdentity> PrimaryIdentitySelector { get; set; }
public virtual IIdentity Identity { get; }
public virtual IEnumerable Identities { get; }
public virtual IEnumerable Claims { get; }
public virtual void AddIdentities(IEnumerable identities);
public virtual void AddIdentity(ClaimsIdentity identity);
public virtual ClaimsPrincipal Clone();
public virtual IEnumerable FindAll(Predicate match);
public virtual IEnumerable FindAll(string type);
public virtual Claim FindFirst(string type);
public virtual Claim FindFirst(Predicate match);
public virtual bool HasClaim(Predicate match);
public virtual bool HasClaim(string type, string value);
public virtual bool IsInRole(string role);
public virtual void WriteTo(BinaryWriter writer);
}

方法和属性有点多,那么我们重点关注一下构造函数以及可以AddXXX开头的方法。

这里有一个窍门,对于一个陌生的类来说,构造函数对于类本身是个很重要的特征,我们可以通过构造函数分析出这个类需要哪些基础数据。

所以,通过简单的分析,我们需要继续了解这两个类:

public class ClaimsIdentity : IIdentity
{
public ClaimsIdentity();
public ClaimsIdentity(string authenticationType);
public ClaimsIdentity(IIdentity identity);
public ClaimsIdentity(IEnumerable claims);
public ClaimsIdentity(IEnumerable claims, string authenticationType);
public ClaimsIdentity(IIdentity identity, IEnumerable claims);
public ClaimsIdentity(string authenticationType, string nameType, string roleType);
public ClaimsIdentity(IEnumerable claims, string authenticationType, string nameType, string roleType);
public ClaimsIdentity(IIdentity identity, IEnumerable claims, string authenticationType, string nameType, string roleType);

}

public class Claim
{
public Claim(BinaryReader reader);
public Claim(BinaryReader reader, ClaimsIdentity subject);

public Claim(string type, string value);
public Claim(string type, string value, string valueType);
public Claim(string type, string value, string valueType, string issuer);

public Claim(string type, string value, string valueType, string issuer, string originalIssuer);
public Claim(string type, string value, string valueType, string issuer, string originalIssuer, ClaimsIdentity subject);
protected Claim(Claim other);
protected Claim(Claim other, ClaimsIdentity subject);
public string Type { get; }
public ClaimsIdentity Subject { get; }
public IDictionary Properties { get; }
public string OriginalIssuer { get; }
public string Issuer { get; }
public string ValueType { get; }
public string Value { get; }
protected virtual byte[] CustomSerializationData { get; }
public virtual Claim Clone();
public virtual Claim Clone(ClaimsIdentity identity);
public override string ToString();
public virtual void WriteTo(BinaryWriter writer);
protected virtual void WriteTo(BinaryWriter writer, byte[] userData);
}

所以,看到这里就会发现,我们可以通过以下方式保存信息:

List claims = null;
var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme,new ClaimsPrincipal(identity));

这时候,数据就可以保存在Cookie里了,那么如何在控制器中获取到数据呢:

public ClaimsPrincipal User { get; }

在控制器中,提供了这样一个属性,当然如果想要正确获取到值的话,需要在 Startup.cs类中的添加如下配置:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ……省略其他配置
app.UseAuthorization();
app.UseAuthentication();
// ……省略其他配置
}

到此,相信大家对"asp.net core的Identity身份验证怎么实现"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

验证 身份 控制器 方法 控制 信息 特性 用户 数据 函数 属性 页面 登录 配置 不用 内容 可以通过 地址 子类 实际 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 厦门一联网络技术服务有限公司 青岛东王子软件开发公司 ice服务器管理的进入方式 电脑进不了黑魂服务器 我的世界服务器在哪儿买好 开封市网络安全与信息委员会 阿里云服务器独立管理 日新月异的网络技术 网络安全方向的工作分析 包头市国家网络安全宣传周 国盾互联沈继东联软件开发 青冈游戏软件开发 济南软件开发十年工资一般多少 国内外碳汇数据库 未成年人如何学习网络安全知识 联想3650M5服务器不启动 男主软件开发老电视剧 dos系统中启动数据库 高斯数据库 信创 数据库游标异常关闭 长沙网络安全系统公司 远程服务器出现发生身份验证错误 梦幻西游服务器转入山东云服务器 属于经济类数值类数据库的有 腾讯地下城服务器怎么样 商职的计算机网络技术咋样 杭州康美德网络技术有限公司 网络安全 论述文 h服务器带外装系统 移动计算软件开发技术
0