IPrincipalIIdentity介绍

Posted fanfan-90

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IPrincipalIIdentity介绍相关的知识,希望对你有一定的参考价值。

.NET的认证和授权相关的核心是2个接口System.Security.Principal.IPrincipal 和 System.Security.Principal.IIdentity。


IPrincipal:
用户对象表示用户的安全上下文,代码当前即以该用户的名义运行,包括用户的标示(IIdentity)和他们所属的任何角色。所有的用户对象都需要实现IPrincipal。
如果想对现有的asp.net应用程序应用用户角色验证,那么可以通过IPrincipal借口自定义一个CustomPrincipal来实现用户角色验证。
IIdentity:
定义标示对象的基本功能;代表特定用户的标示对象,代码当前以该用户的名义运行。

.NET的支持基于角色的授权。.NET的IPrincipal接口的IsInRole方法是授权的核心。有两种方式使用:
1.使用内置的IPrincipal对象(如GenericIdentity),在认证的同时加载用户的角色roles。
2.自定义IPrincipal实现,实现自己的IsInRole逻辑。ASP.NET中实现的的RolePrincipal就通过将逻辑转发给System.Web.Security.Roles静态类。Roles依赖System.Web.Security.RoleProvider接口实现角色的查询,我们可以通过web.config的相关节点来配置自定义的RoleProvider。

ASP.NET Forms认证主采用RolePrincipal主体,未认证用户设置为GenericIdentity标识,已认证用户设置为FormsIdentity。RolePrincipal在验证角色时将使用Roles静态类通过RoleProvider进行角色验证。通过HttpContext.User可以直接调用主体。
实现一个最简单的自定义RoleProvider只需要继承并实现GetRolesForUser和IsUserInRole两个方法,通常可以使用委托在Application_Start中注入的方式实现通用的RoleProvider。
ASP.NET的forms验证通过FormsAuthentication发送和注销用于认证的token,通过配置web.config可以让不同的Web服务器以相同的方式对token加密和解密以适应Web服务器负载均衡。不适用cookie承载token时,可以自定义认证逻辑,比如通过url参数方式承载token配合ssl用于app客户端验证等。




自定义RoleProvider的示例,省略了不需要实现的部分代码,GetRolesForUserDelegate和IsUserInRoleDelegate在Application_Start中注入即可彻底实现RoleProvider和应用服务代码的解耦:

 

public class SimpleRoleProvider : RoleProvider
    {
        public static Func<string, string[]> GetRolesForUserDelegate;

        public static Func<string, string, bool> IsUserInRoleDelegate;

        public override string[] GetRolesForUser(string username)
        {
            return GetRolesForUserDelegate(username);
        }

        public override bool IsUserInRole(string username, string roleName)
        {
            return IsUserInRoleDelegate(username, roleName);
        }
    }

Forms身份验证和RoleProvider的分别定义在web.config配置文件中。ASP.NET的配置文件示例(省略了其他配置):

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/Home/Login" cookieless="UseCookies" slidingExpiration="true" />
    </authentication>
    <roleManager defaultProvider="SimpleRoleProvider" enabled="true">
      <providers>
        <clear />
        <add name="SimpleRoleProvider" type="Onion.Web.SimpleRoleProvider" />
      </providers>
    </roleManager>
  </system.web>
</configuration>


.NET中还有用于配置Pricipal的两个方法System.AppDomain.SetThreadPrincipal和System.AppDomain.SetPrincipalPolicy以及控制访问的两个类型System.Security.Permissions.PrincipalPermission和System.Security.Permissions.PrincipalPermissionAttribute。

参考:https://blog.csdn.net/lidew521/article/details/82253974

以上是关于IPrincipalIIdentity介绍的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL——02变量的使用

Circom 2.0: A Scalable Circuit Compiler

iOS--当cell上显示不同数量图片的时候重用

Rust 宏可以创建新的标识符吗?

vue-resource 怎么解决跨域问题

Javascript字符串集函数