ASP.NET安全架构--如何实现.NET安全

简介:

      前言:大家是否在用Forms验证的时候,常常被很多的概念搅混?是否真的明白什么是Principal,Identity,以及 IPrincipan...?很多的文献很少提及这些到底是什么,仅仅是怎么用,结果出问题,导致很多的朋友的理解仅仅停在表面,使用起来也是束手束脚。相信看完本篇,会有一定的收获的。

       ASP.NET安全架构为实现Web应用程序的安全模式提供了对象模型。不管我们选择哪一种的身份验证模式,其中很多的要素是相同的。登录到应用程序的用户按照他们提供的凭证被授予Principal和Identity。其中Principal对象表示的是用户的当前的安全上下文,包括用户的标识和他们所属的角色。Identity对象表示的是当前用户。Principal对象是利用Identity对象(表示用户的标识)创建的,而且它添加一些额外的信息,比如角色或者自定义的数据。

简言之:Principal=Identity+角色+自定义数据

大家要注意一点:身份验证是发生在ASP.NET运行的特定的时期的,记住这一点,具体的以后会讲的。 下面我们具体的谈:

一 表示安全的上下文 
       Identity对象表示的是通过身份验证的用户。Identity对象的类型取决于所使用的身份验证,如,Windows身份验证使用的是 WindowsIdentity对象,而Froms验证使用的是FormsIdentity对象。

       大家开始接触Identity概念有点难受,其实说白了Identity就是一个用户的标识,标识是什么?就是标明用户是什么,用户名字是什么而已,只是我们这里说的比较专业一点点而已。 
       另外,Principal对象表示的是通过身份验证的用户的组或者角色的成员:也就当前用户安全上下文。说安全上下文,说白点就是这个对象包含很多的用户身份的一些信息。Principal对象是有IIS中的Windows 身份验证自动的创建的,但是我们也可以创建普通的Principal对象(大家后面就慢慢明白的). 
       大家在编程的时候,或多或少用过HttpContent.Currrent.User属性,其实它表示的就是一个Principal对象.Principal对象是实现了IPrincipal接口的。 
  IPrincipal 接口 
       不同的身份验证模式对安全的上下文有不同的要求。我们可以利用Principal对象表示当前的安全上下文。 IPrincipal接口定义了Principal对象的基本功能。而且我们还可以自定义安全的上下文对象,只要实现 System.Security.Principal接口:

Identity属性--可以获取当前Principal对象的Identity.之前说过:Principal包含Identity就是这个原因。 
IsInRole(string roleName)方法--可以判断当前的Principal对象是否属于指定的角色。大家在变成时候也用过类似的HttpContent.Current.User.Identity.IsInRole("Admin")语句。 
       Principal对象可以通过HttpContent.Current.User属性访问到,下面的代码大家应该都用过的:

if(HttpContext.Current.User.Identity.IsAuthenticated) 

  lblUserName.Text=HttpContext.Current.User.Identity.Name+"已经登录"; 
}

(注:Identity是用户的标识,包含用户名。我们后面会讲的)

      下面的代码就更加的常见了:判断当前的用户是否是管理员角色

if(HttpContext.Current.User.IsInRole("Admin") 

// 
}

       接着我们就看看ASP.NET内置的实现了IPrincipal接口的对象: 
GenericPrincipal类 
       GenericPrincipal类实现了IPrincipal接口。从名字可以看出GenericPrincipal对象表示的是一个一般的,基础的安全上下文,它仅仅只是定义了当前用户的角色,也就是说这个对象只是部分的实现了IPrincipal接口。(以后我们就把实现 IPrincipal接口的对象称为 主体)。对于一种身份验证模式来讲,如 Windows身份验证,它使用的就是WindowsPrincipal,因为WindowsPrincipal更加具体的实现了IPrincipal。而在Forms验证中,用的只是一般的GenericPrincipal。也就是说,我们可以按照我们的要求实现自定义的Principal对象。下面会讲到的。 
       IPrincipal接口的每一个实现都要重写Identity属性和IsInRole方法。GenericPrincipal类的 IsInRole方法是通过把角色值和在字符串在中定义的角色进行比较,而WindowsPrincipal类的IsInRole方法则是把角色和被分配到Windows用户帐户角色进行比较。

       我们可以创建一个在当前请求的整个生命周期中都要使用的GenericPrincipal类的实例,并把它赋值给HttpContent.Current.User属性。 
GenericPrincipal的构造函数有两个参数:用户的GenericIdentity(用户标识GenericIdentity实现了 IIdentity接口),和一个表示用户角色的字符串数组。所以我们之前说:Principal=Identity+角色就是这原因。 
       GenericPrincipal 对象一旦被创建,就可以赋值到HttpContent.Current.User属性,用来表示当前请求用户的安全的上下文。 
       下面就是创建的代码例子:

 

//创建一般的GenericPrincipal 
//我们说过:标识就是包含用户名的对象,如下 包含一个名为"xiaoyang"的标识 
GenericIdentity identity=new GenericIdentity("xiaoyang"); 
//创建GenericPrincipal 
//注roles表示的是一个角色的字符串数组如role=new string{"Admin","Customer"}; 
GenericPrincipal principal=new GenericPrincipal(identity,roles); 
//附加 
HttpContext.Current.User=principal;

 

  注意:上面的代码是要写在特定的地方,也就是生命周期的特定的时候的,我们后面讲述。 
       说了Principal,下面就说说用户标识到底是什么,之前多次提到的。 
二 用户标识 
   Identity对象用于标识当前用户的标识。标识只能提供少量的安全上下文信息,如用户名。Identity对象可以验证用户。 
      IIdentity接口 
       和IPrincipal接口一样,表示用户标识的对象都要实现这个接口。IIdentity接口定义了Identity对象的基本额的结构,定义如下:

AuthenticationType(string类型的)属性--它可以获取所使用的身份验证的类型,如,如果使用的Forms验证,该属性返回"Forms"字符串,所以我们自定义的标识可以返回"CustomIdentity"字符串。 
      IsAuthenticated(bool类型)属性--标识用户是否通过身份验证。我们可以常常用HttpContext.Current.User.Identity.IsAuthenticated来判断用户是否已经登录。 
Name(string 类型的)属性--获取用户的名字。相信对HttpContext.Current.User.Identity.Name不陌生。

       下面我们就看看我们自己的实现了IIdentity接口的标识类。

 

using System; 
using System.Security.Principal; 
public class CustomIdentity : IIdentity 

private string name; 
//构造函数只接收一个string参数,大家可以看看之前我们代码:GenericIdentity identity=new GenericIdentity("xiaoyang"); 
public CustomIdentity(string name) 
        { 
this.name = name; 
        } 
// 
private string authenticateType = "CustomerIdentity"; 
public CustomIdentity(string name,string authenticateType) 
        { 
this.name = name; 
this.authenticateType = authenticateType; 
        } 
//下面就实现接口 
private bool isAuthenticated = false; 
public bool IsAuthenticated 
        { 
get { return isAuthenticated; } 
        } 
private string name; 
public string Name 
        { 
get { return name; } 
        } 
}

 

      上面的代码只是示范,大家可以按照自己的要求扩展。 
       和之前一样,我们来看看ASP.NET中内置的Identity类: 
  FormsIdentity--在Forms验证中使用 
       PasswordIdentity--在Passport验证中使用 
       GenericIdentity--一般的普通的标识 
       WindowsIdentity--Windows 身份验证使用 
       我们来看看GenericIdentity的使用,其他的使用类推。

       其实GenericIdentity标识的是一个基本的Identity 对象。它对于Identity对象来说是做基本的。之前我们看过一个GenericPrincipal的例子,在那个实例中我们创建一个GenericIdentity类的实例,

 

GenericIdentity identity=new GenericIdentity("xiaoyang");

      而且我们还可以提供更加具体的Identity对象,如之前提到的FormsIdentity,开提供具体的用户信息。 
       今天就到这里,希望大家有收获。

本文转自today4king博客园博客,原文链接:http://www.cnblogs.com/jinzhao/archive/2009/05/02/1447909.html,如需转载请自行联系原作者
相关文章
|
4月前
|
人工智能 安全 Cloud Native
Nacos 3.0 架构升级,AI 时代更安全的 Registry
随着Nacos3.0的发布,定位由“更易于构建云原生应用的动态服务发现、配置管理和服务管理平台”升级至“ 一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台 ”。
|
4月前
|
存储 设计模式 人工智能
AI Agent安全架构实战:基于LangGraph的Human-in-the-Loop系统设计​
本文深入解析Human-in-the-Loop(HIL)架构在AI Agent中的核心应用,探讨其在高风险场景下的断点控制、状态恢复与安全管控机制,并结合LangGraph的创新设计与金融交易实战案例,展示如何实现效率与安全的平衡。
739 0
|
1月前
|
存储 监控 安全
132_API部署:FastAPI与现代安全架构深度解析与LLM服务化最佳实践
在大语言模型(LLM)部署的最后一公里,API接口的设计与安全性直接决定了模型服务的可用性、稳定性与用户信任度。随着2025年LLM应用的爆炸式增长,如何构建高性能、高安全性的REST API成为开发者面临的核心挑战。FastAPI作为Python生态中最受青睐的Web框架之一,凭借其卓越的性能、强大的类型安全支持和完善的文档生成能力,已成为LLM服务化部署的首选方案。
|
8月前
|
人工智能 运维 安全
AI 安全架构概述
AI 安全架构涵盖数据采集、模型训练、推理部署等阶段,确保安全性、隐私与合规。其核心组件包括数据层、模型层、推理层、应用层和运维层,针对数据安全威胁(如数据投毒)、模型窃取、对抗攻击及系统漏洞等风险,提出数据加密、对抗训练、联邦学习等防御策略,并强调开发前、开发中和部署后的最佳实践,以降低 AI 解决方案的安全风险。
867 13
|
3月前
|
存储 安全 前端开发
如何开发一套EHS 健康安全环境管理系统?(附架构图+流程图+代码参考)
本文介绍如何开发一套完整的EHS(健康、安全和环境)管理系统,涵盖系统核心模块、技术架构、数据库设计、前后端开发示例及上线建议,帮助企业提升安全管理效率与合规性。
|
3月前
|
传感器 安全 前端开发
如何开发一套EHS健康安全环境管理系统中的风险管理板块?(附架构图+流程图+代码参考)
本文详解企业EHS(健康·安全·环境)系统中的风险管控板块,强调其核心在于构建“识别—评估—巡检—治理—验证”的闭环流程,将风险数据可视化并转化为可落地的行动指引。内容涵盖风险管控的意义、功能边界、系统架构、LEC评估方法、巡检流程、看板设计、开发技巧、落地建议、实现效果及代码参考,帮助技术团队和EHS负责人快速掌握系统搭建要点,提升企业安全管理水平。
|
7月前
|
监控 安全 数据安全/隐私保护
销售易CRM:技术架构与安全性能的深度解析
销售易CRM基于云计算与微服务架构,融合高可用性、弹性扩展及模块化开发优势,为企业提供灵活定制化的客户关系管理解决方案。系统采用多层次安全防护机制,包括数据加密、细粒度权限控制和实时监控审计,确保数据安全与隐私保护。某金融机构的成功案例表明,销售易CRM显著提升了数据安全性和系统性能,同时满足行业合规要求。作为数字化转型的利器,销售易CRM助力企业实现可持续发展与市场竞争力提升。
|
8月前
|
监控 安全 Cloud Native
企业网络架构安全持续增强框架
企业网络架构安全评估与防护体系构建需采用分层防御、动态适应、主动治理的方法。通过系统化的实施框架,涵盖分层安全架构(核心、基础、边界、终端、治理层)和动态安全能力集成(持续监控、自动化响应、自适应防护)。关键步骤包括系统性风险评估、零信任网络重构、纵深防御技术选型及云原生安全集成。最终形成韧性安全架构,实现从被动防御到主动免疫的转变,确保安全投入与业务创新的平衡。
|
监控 安全 Cloud Native
云原生安全:Istio在微服务架构中的安全策略与实践
【10月更文挑战第26天】随着云计算的发展,云原生架构成为企业数字化转型的关键。微服务作为其核心组件,虽具备灵活性和可扩展性,但也带来安全挑战。Istio作为开源服务网格,通过双向TLS加密、细粒度访问控制和强大的审计监控功能,有效保障微服务间的通信安全,成为云原生安全的重要工具。
231 2
下一篇
oss云网关配置