千家信息网

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

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"asp.net core的Identity身份验证怎么实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"asp.net core的Ide
千家信息网最后更新 2026年11月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安全错误 数据库的锁怎样保障安全 广东万易互联网科技有限公司惠州分公司 科技企业和互联网企业 科技互联网技术 苏州互联网科技贷款公司 互联网科技ppt模板 互联网科技小额贷款 深圳期待互联网科技 云创客互联网科技公司 现代科技和互联网有关系吗 互联网系的金融科技公司 苏州铭阳互联网科技有限公司 保险科技服务互联网营销体系 山东子淼互联网科技有限公司 梅州GM互联网络科技有限公司 广州互联网高科技取餐柜 广州有谷有贝互联网科技有限公司 吉林省码上互联网科技电话 互联网科技平台产品运营 互联网科技创新创业项目 亚光科技低轨卫星互联网 科技互联网 科技互联网项目 互联网科技英文 碳银互联网科技有限公司 互联网科技股午盘股票涨跌 互联网科技公司需要的职位 厦门比较好的科技互联网公司 洛阳昕诺飞互联网科技有限公司 昆明中奇联合互联网科技 10位科技互联网大佬
0