.net mvc 扩展IPrincipal接口

 1 1.自定义实现IPrincipal接口的类
 2  interface ICustomPrincipal : IPrincipal
 3 {
 4     string Identifier { get; set; }
 5     string IdentityType { get; set; }
 6 }
 7 public class CustomPrincipal : ICustomPrincipal
 8 {
 9     public IIdentity Identity { get; private set; }
10     public bool IsInRole(string role) { return false; }
11     public CustomPrincipal()
12     {
13     }
14     public CustomPrincipal(string identifer)
15     {
16         this.Identity = new GenericIdentity(identifer);
17     }
18
19     public  CustomPrincipal(IIdentity identity)
20     {
21         this.Identity = identity;
22     }
23
24     public string Identifier
25     {
26         get;
27         set;
28     }
29
30     public string IdentityType
31     {
32         get;
33         set;
34     }
35 }
36 public class CustomPrincipalSerializeModel
37 {
38     public string Identifier { get; set; }
39     public string IdentityType { get; set; }
40 }
41 2.登录成功,存储相关登录信息
42 CustomPrincipalSerializeModel serializeModel = new CustomPrincipalSerializeModel();
43 serializeModel.Identifier = model.Account;
44 serializeModel.IdentityType = "email";
45
46 JavaScriptSerializer serializer = new JavaScriptSerializer();
47
48 string userData = serializer.Serialize(serializeModel);
49
50 FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
51          1,
52          model.Account,
53          DateTime.Now,
54          DateTime.Now.AddMinutes(15),
55          false,
56          userData);
57
58 string encTicket = FormsAuthentication.Encrypt(authTicket);
59 HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
60 Response.Cookies.Add(faCookie);
61 3.在Global文件中注册Application_PostAuthenticateRequest事件
62 protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
63 {
64     HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
65
66     if (authCookie != null)
67     {
68         FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
69
70         JavaScriptSerializer serializer = new JavaScriptSerializer();
71
72         CustomPrincipalSerializeModel serializeModel = serializer.Deserialize<CustomPrincipalSerializeModel>(authTicket.UserData);
73
74         CustomPrincipal newUser = new CustomPrincipal(authTicket.Name);
75         newUser.Identifier = serializeModel.Identifier;
76         newUser.IdentityType = serializeModel.IdentityType;
77
78         HttpContext.Current.User = newUser;
79     }
80
81 }
82 4.在BaseController中获取登录相关信息
83 protected virtual new CustomPrincipal User
84 {
85     get { return HttpContext.User as CustomPrincipal; }
86 }
87 5.方法中使用
88 User.Identifier
时间: 2024-11-01 14:39:53

.net mvc 扩展IPrincipal接口的相关文章

面向接口可扩展框架之“Mvc扩展框架及DI”

面向接口可扩展框架之“Mvc扩展框架及DI” 标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整合了一下 一.Mvc扩展框架主要功能: 1.Mvc的依赖注入(DI)功能(类MvcDependency) 依赖IContainerFactory接口,不再依赖具体容器 2.Mvc全局过滤器(GlobalFilterProvider) 配置在Mvc的依赖注

MVC扩展控制器工厂,通过继承DefaultControllerFactory来决定使用哪个接口实现,使用Ninject

希望实现的效果是:对购物车中所有商品的总价,实现9折或8折: 当点击"9折": 当点击"8折": □ 思路 8折或9折是打折接口的不同实现,关键是:由什么条件决定使用哪种打折方式? --当点击8折或9折链接的时候,把参数放在路由中,然后在自定义控制器工厂中根据参数的不同选择使用哪种打折方式. □ model public class CartLine    {        public int Id { get; set; }        public stri

Asp.net 面向接口可扩展框架之“Mvc扩展框架及DI”

标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整合了一下 一.Mvc扩展框架主要功能: 1.Mvc的依赖注入(DI)功能(类MvcDependency) 依赖IContainerFactory接口,不再依赖具体容器 2.Mvc全局过滤器(GlobalFilterProvider) 配置在Mvc的依赖注入容器中就能自动易用上,其实逻辑很简单,就是继

【3】.net MVC 使用IPrincipal进行Form登录即权限验证

1.在MVC项目中添加用户类,可以根据实际项目需求添加必要属性 public class UserData { /// <summary> /// ID /// </summary> public int UserId { get; set; } /// <summary> /// 用户名 /// </summary> public string UserName { get; set; } /// <summary> /// 角色ID列表 //

MVC扩展Filter,通过继承HandleErrorAttribute,使用log4net或ELMAH组件记录服务端500错误、HttpException、Ajax异常等

□ 接口 public interface IExceptionFilter{    void OnException(ExceptionContext filterContext);} ExceptionContext继承于ControllerContext,从中可以获得路由数据route data.HttpContext. □ 的HandleErrorAttribute是对IExceptionFilter的实现,默认是启用的 public static void RegisterGlobal

MVC扩展控制器工厂,通过实现IControllerFactory

关于控制器工厂的扩展,要么通过实现IControllerFactory接口,要么通过继承DefaultControllerFactory.本篇中,我想体验的是: 1.当请求经过路由,controller, action名称是以key/value键值对形式存放的,我们可以通过RequestContext.RouteData.Values["action"]和RequestContext.RouteData.Values["controller"]获取action或co

MVC扩展ModelBinder使类型为DateTime的Action参数可以接收日期格式的字符串

原文:MVC扩展ModelBinder使类型为DateTime的Action参数可以接收日期格式的字符串 如何让视图通过某种途径,把符合日期格式的字符串放到路由中,再传递给类型为DateTime的控制器方法参数?即string→DateTime.MVC默认的ModelBinder并没有提供这样的机制,所以我们要自定义一个ModelBinder. 首先,在前台视图中,把符合日期格式的字符串赋值给date变量放在路由中: @Html.ActionLink("传入日期格式为2014-06-19&quo

MVC扩展DataAnnotationsModelMetadataProvider给model属性对应的页面元素添加任意属性和值

比如,有这样一个类: public class User    {        public string Name { get; set; }    } 当在强类型视图页,显示属性Name对应的input元素,并想添加一个title属性和对应的值,如图: □ 思路 →自定义TooltipAttribute,可以打到Name属性上.→自定义DataAnnotationsModelMetadataProvider,把TooltipAttribute的Tooltip属性值放到放到ModelMeta

MVC扩展ModelBinder,通过继承DefaultModelBinder把表单数据封装成类作为action参数

把视图省.市.街道表单数据,封装成一个类,作为action参数.如下: action方法参数类型: namespace MvcApplication1.Models{    public class Customer    {        public string Address { get; set; }    }} 在自定义ModelBinder中,接收视图表单数据,封装成Customer类. using System.Web; using System.Web.Mvc; using M