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介绍的主要内容,如果未能解决你的问题,请参考以下文章