惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
腾讯CDC
G
Google Developers Blog
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
有赞技术团队
有赞技术团队
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
美团技术团队
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志

博客园 - KUDO

精解PSI-SI(二) 精解PSI-SI(一) DVB码流中业务信息与电子节目指南 什么是ECM,EMM,AU,EMU? showModalDialog()、showModelessDialog()方法使用详解 js收藏 ASP.NET 2.0 中改进的缓存功能 js 日历控件 - KUDO - 博客园 在VS2005中 GridView导入Excel的两点小技巧-附源码 Python 一门神奇的语言 如何实现选择DataGrid单元格时显示选择一行 获取checkbox onclick事件中的参数 javascript 技巧 网页及其控件有很多触发事件 网页代码常用小技巧总结续,网页制作学习 Microsoft .NET 框架资源基础 js\css 让图片垂直居中 - KUDO - 博客园 制作随表格拉伸的背景图 基于aspnet Forms身份验证基本原理
crm具体问题具体实现
KUDO · 2006-08-30 · via 博客园 - KUDO
  • 国际化的实现
    1.创建项目ResourceLanguage
    2.添加资源文件ResourceLanguage.resx,添加数据(添加数据是最好不要使用html标记,这样会造成编译错误),编译
    这时资源文件的路径应该是resourceLanguage.ResourceLanguage.resource,为了调用方便,一般可以设置项目的名字空间为空,这样我们调用时,只用通过ResourceLanguage.resource访问就可以了
    3.下面是装载资源文件:

    const string baseResourceFile = "ResourceLanguage";
                    Assembly primaryResource 
    = Assembly.Load(baseResourceFile);
                    Application[
    "RM"= new ResourceManager(baseResourceFile, primaryResource);

    4.添加属性,用于获取资源包

        public class Root
        
    {
            
    public Root()
            
    {
            }


            
    private static ResourceManager _rm;
            
    public static ResourceManager rm
            
    {
                
    get
                
    {
                    
    if(_rm==null)
                        _rm 
    = (ResourceManager) HttpContext.Current.Application["RM"];
                    
    return _rm;
                }

            }

        }

    5.调用

    Root.rm.GetString("Lgntxt4");


    (注意:国际化文档时,value值如果用到了HTML标记,请注意标记一定要规范,部分标记无法使用,不然会报告错误,如使用 标记,会报告xmlvalidatingreader 并相应地设置 entityheadling 属性的错误)
  • 身份验证票,验证用户权限以控制是否有权访问某页面(待续)
    1.web.config设置,采用Forms身份验证方式:

    <authentication mode="Forms">
                
    <forms name=".CRM" protection="All" timeout="60" loginUrl="login.aspx" slidingExpiration="true" />
            
    </authentication>

    2.项目下各级目录下页面文件访问授权的设置:

    <configuration>
        
    <system.web>
        
    <authorization>
            
    <allow roles="SystemAdministrator,MembershipAdministrator" />
            
    <deny users="*" />
        
    </authorization>
        
    </system.web>

        
    <location path="ShowAllUsers.aspx">
          
    <system.web>
            
    <authorization>
              
    <allow roles="SystemAdministrator,MembershipAdministrator" users="?" />
            
    </authorization>
          
    </system.web>
        
    </location>
    </configuration>

    3.验证票的建立

    public FormsAuthenticationTicket(
    int version, //设为1
    string name, //用户标示
    DateTime issueDate, //Cookie 的发出时间, 设置为 DateTime.Now 
    DateTime expiration, //过期时间
    bool isPersistent, //是否持久性(根据需要设置,若是设置为持久性,在发出
    cookie时,cookie的Expires设置一定要设置)
    string userData, //这里用上面准备好的用逗号分割的role字符串
    string cookiePath // 设为"/",这要同发出cookie的路径一致,因为刷新cookie
    要用这个路径
    );

    FormsAuthenticationTicket Ticket 
    = new FormsAuthenticationTicket (1,"kent",DateTime.Now, DateTime.Now.AddMinutes(30), false,UserRoles,"/") ;


    4.生成验证票

    //将身份验证票加密序列化成一个字符串
    string HashTicket = FormsAuthentication.Encrypt (Ticket) ;
    //生成cookie
    HttpCookie UserCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket) ;

    5.将身份验证票Cookie输出到客户端
    通过Response.Cookies.Add(UserCookie) 将身份验证票Cookie附加到输出的cookie集合中,发送到客户端.
    6.重定向到用户申请的初试页面.
    Context.Response.Redirect (Context.Request["ReturnUrl"]) ;
    7.基于角色访问授权

    protected void Application_AuthorizeRequest(object sender, System.EventArgs e)
    {
        HttpApplication App 
    = (HttpApplication) sender;
         HttpContext Ctx 
    = App.Context ; //获取本次Http请求相关的HttpContext对象
        if (Ctx.Request.IsAuthenticated == true//验证过的用户才进行role的处理
        {
            FormsIdentity Id 
    = (FormsIdentity)Ctx.User.Identity ;
            FormsAuthenticationTicket Ticket 
    = Id.Ticket ; //取得身份验证票
            string[] Roles = Ticket.UserData.Split (',') ; //将身份验证票中的role数据转成字符串数组
            Ctx.User = new GenericPrincipal (Id, Roles) ; //将原有的Identity加上角色信息新建一个GenericPrincipal表示当前用户,这样当前用户就拥有了role信息
        }

    }

  • 地址重载(待续)
  • 页面存储机制(viewstate)(待续)
    1.重载LoadPageStateToPersistenceMedium方法

    protected override object LoadPageStateFromPersistenceMedium()
            
    {
                
    if (_formatter == null)
                
    {
                    _formatter 
    = new LosFormatter();
                }


                
    string str = Request.Form["__VIEWSTATE_KEY"];
                
    if (!str.StartsWith("VIEWSTATE#"))
                
    {
                    
    throw new Exception("Invalid viewstate key:" + str);
                }

    #if VIEWSTATETOSQLSERVER

                
    //从数据库中获取ViewState,参数为SessionID
                db.GetViewState(a);
                
    //操作失败则跳转到上一页面    
                
                
    //返回序列化后的viewstate
                return _formatter.Deserialize(viewState);
    #else
                
    if (!str.StartsWith("VIEWSTATE#"))
                
    {
                    
    throw new Exception("Invalid viewstate key:" + str);
                }

                
    return Cache[str];
    #endif
            }

    2重载 SavePageStateToPersistenceMedium方法

    protected override void SavePageStateToPersistenceMedium(object viewState)
            
    {
                
    string str = "VIEWSTATE#" + Session.SessionID.ToString() + "#" + DateTime.Now.Ticks.ToString();
                
    //自动注册隐藏字段
                RegisterHiddenField("__VIEWSTATE_KEY", str);
                RegisterHiddenField(
    "__VIEWSTATE""");

                
    if (_formatter == null)
                
    {
                    _formatter 
    = new LosFormatter();
                }


    #if VIEWSTATETOSQLSERVER
                StringWriter _writer 
    = new StringWriter();
                _formatter.Serialize(_writer, viewState);

                
                
    //$$$$$$$$$此处插入将viewstate写入数据库,需要提供参数:Request.Path,用户ID,SessionID,ViewState$$$$$$$$$
                
    //如果操作失败,则从数据库中删除sessionID对应的所以记录
                db.InsertSession(a,b,c,d);
    #else
                Cache.Add(str, viewState, 
    null, DateTime.Now.AddMinutes(Session.Timeout), TimeSpan.Zero, CacheItemPriority.Default, null);
    #endif
            }


  • 页面存储机制(cache)(待续)
  • 异常处理(待续)
  • 页面皮肤(待续)
  • 数据访问机制(待续)
  • 代码安全机制(待续)