点缀's Blog

用.NET点缀我们的生活
随笔 - 44, 评论 - 378, 引用 - 84

导航

关于

脊柱是我们这种生命的重要特征,在此基础上我们才有了光芒的智慧和丰富的情感。上帝赋予我们自由的意志,同时也赋予我们选择的重担。

标签

每月存档

最新留言

广告

Asp.net ViewState 反编码器!:(

续上篇笔记:

  ViewState decoder :

 

还找到一个在线版本:

http://www.wilsondotnet.com/Demos/ViewState.aspx

 

posted on 2004-05-17 17:58:00 by aspdian  评论(9) 阅读(5400)

ASP.Net ViewState 安全吗?

        最近在看到一个朋友使用工具能从ASP.Net 页面中 的 __VIEWSTATE 字段中取得页面中所有控件与控件中的数据。虽然还没有听说过因为ViewState 产生什么漏洞,但感觉不太有信心(给MS 的补丁吓着了)。

     当然了,想要对它进行一个有效的防御。在默认方式下,ASP.NET 是使用 SHA1 算法对 ViewState 的 hashcode  进行编码的。在 machine.config 文件中的<machineKey>  段可以设定你所用的编码规则。

如:<machineKey validation="MD5" />   使用MD5 编码规则
    <machineKey validation="3DES" />  使用 3DES 编码

还有一个特别的问题:在两台或者两台以上的服务器上共享 ViewState. 也就是生成ViewState 与读取它的不是同一台服务器。那就不得不使用 machineKey 中的validationKey 字段。并且在服务器间要使用相同的Key 。

如:<machineKey validation="SHA1" validationKey="
F3690E7A3143C185AB1089616A8B4D81FD55DD7A69EEAA3B32A6AE813ECEECD28DEA66A
23BEE42193729BD48595EBAFE2C2E765BE77E006330BC3B1392D7C73F" />



 

posted on 2004-05-17 08:24:00 by aspdian  评论(26) 阅读(9551)

My passport 续谈

续上次浅谈了一下passport 的实现。在自己的项目中也进行了运用。

就对于开发中发现的问题进行一下说明。

想达到的目的:
 在多个应用系统共享一个用户身份验证系统,而用户在各应用系统中的权限由应用系统自己处理。

主要流程:
 应用程序->当用户访问受限页面 -> 由MyPassport 进行身份验证 -> 用户注册 MyPassport 帐号 -> 登录 MyPassport  -> 返回应用程序 -> 应用程序得到用户信息 -> 分析角色或权限 -> 访问受限页面

主要的类:

MYPassportAuthentication  -- 提供为操作身份验证票提供帮助器实用工具的静态方法
MYPassportAuthenticationModule : IHttpModule - 模块初始化和处置事件
MYPassportAuthenticationEventArgs  : EventArgs  -  事件参数类
MYPassportAuthenticationTicket - 验证票
MYPassportConfiguration  - 配置类
MYPassportConfigurationHandler : IConfigurationSectionHandler  - 配置分配
MYPassportIdentity :IIdentity - 用户验证信息 与 HttpContext.User.Identity 统一

有了上面几个类的设计,就可以进行开发了。
我们选用的数据传送方式是:"查询字符串",即"查询字符串" 做为应用程序间 Ticket 信息的信道

当一个应用程序需要登录时,转向MYPassport 的地址是 : http://mypassport.net/login.aspx?appId=11&ru=http://myapplication.com/somepage.aspx
ru为返回应用程序的地址, 其中的 AppId 为应用程序的ID号,用于当ru 信息丢失时使用。

当完成登录:返回应用程序,地址为: http://myapplication.com/somepage.aspx?ticket=%%^^&&(
这里的ticket 为加密后的票,在返回到 应用程序的 MYPassportAuthenticationModule 时,对request.url 进行分析,把ticket 分离出来,
生成真正的 ticket,取得 用户信息,取得权限。完成注册。

 

一,MYPassportAuthentication 类
 由于 Ticket 在网络上传送时,要对数据进行一下加密。等到达应用程序时再进行解密。得到我们想要的票信息。
 public static MYPassportAuthenticationTicket Decrypt(string strTicket) // 进行解密
 public static string Encrypt(MYPassportAuthenticationTicket ticket) // 加密

 这些都是公共的方法,没有什么好说的。

二,MYPassportAuthenticationModule : IHttpModule
 注册验证事件与处理

  public event MYPassportAuthenticationEventHandler Authenticate; 

  public void Init(HttpApplication context)
  {
   context.AuthenticateRequest +=new EventHandler(OnEnter);
   context.EndRequest += new EventHandler(this.OnLeave);   
  }
 对ticket 进行处理。

 web.config
 <httpModules>
         <add type="MYCom.Security.KK7PassportAuthenticationModule,MYCom.Security"
              name="MYPassport"/>
    </httpModules>

 
三, MYPassportAuthenticationEventArgs
 验证事件参数。当发生验证时,取得用户的MYPassportIdentity 信息

四,MYPassportAuthenticationTicket
 票,
 主要是:用户名,用户基本的信息,与票生成的时间,以及有效期等

五,MYPassportConfiguration 类
 mypassport 的配置类,包含了,passport 站点的地址,应用程序的ID号以及用户程序中那些是受限的页面。

六,MYPassportConfigurationHandler 类
 internal class MYPassportConfigurationHandler : IConfigurationSectionHandler
 {

  public virtual object Create(Object parent, Object context, XmlNode node)
  {
   MYPassportConfiguration config = new MYPassportConfiguration();

   try
   {
    config.LoadValuesFromConfigurationXml(node); //读取配置信息
   }
   catch
   {
    throw new Exception("无法读取 Passport 设定!!");

   }
   return config;
  }
 }

 web.Config 文件:
   
     <configSections>
      <sectionGroup name="Passport">
         <section name="PassportSettion" type="MYCom.Security.MyPassportConfigurationHandler,MyCom.Security">
         </section>
      </sectionGroup>
 </configSections>

   <Passport>
      <PassportSettion AppId="2" passportSite="http://mypassport.net/">
         <AuthPages>
           <location  path="/PostArticle.aspx" User="?"></location>
           <location  path="/PostPoll.aspx" User="?"></location>
           <location  path="/PostReply.aspx" User="?"></location>
           <location  path="/myArticles.aspx" User="?"></location>
           <location  path="/ModifUserInfo.aspx" User="?"></location>
           <location  path="/AddAttachment.aspx" User="?"></location>
           <location  path="/Admin/*.aspx" user="?"></location> <!-- admin 目录下的所有后缀为 aspx 的文件受限 /-->
    <location  path="/DATA/*.*" user="?"></location><!-- data 目录下的所有的文件受限 /-->
         </AuthPages>
      </PassportSettion>
   </Passport>

七,MYPassportIdentity 类
 用户的基本信息。
 protected void MyPassport_OnAuthenticate(Object sender, MYPassportAuthenticationEventArgs e)
  {

   // 对用户进行验证
   MYPassportIdentity passportIdentity  = e.MYPassportIdentity;

   string [] roles = null;
   if (passportIdentity.IsAuthenticated )
   {
    roles = getRoles( passportIdentity); //读取用户权限
   }
   Context.User = new GenericPrincipal( passportIdentity,roles);  //生成一般用户
 }

这样就基本完成了一个passport 系统的的创建,当然只有这些是远远不够的。还有MYpassport 主站的建设工作,应用程序的注册等。
如有什么问题请与我联系。 笑脸


 

posted on 2004-04-26 21:47:00 by aspdian  评论(18) 阅读(5585)

Forum 2.0 latest 的安装

今天看到mmkk 的回复,就试着安装了一下 这个 AspForum 2.0 .

第一步:

安装数据库:

在自己的Sql Server 里创建一个库: AspForumDB

Create Database AspForumDB

然后运行几个 .Sql  脚本文件.(请注意顺序) 

文件都在: (forums_latest_source\ASP.NET Forums\Data Providers\SqlDataProvider\sql) 中

  1. 2003.10-Tables.sql
  2. 2003.10-Functions.sql
  3. 2003.10-Procedures.sql
  4. 2003.10-Data.sql
  5. 2003.10.Alpha.sql
  6. forums_alpha_to_beta.sql

第二步

创建 Forum 2.0 工程(你的机器上一定要IIS, VS 2003)

  •  把 forums_latest_source\ASP.NET Forums\Web 目录全部copy 到 你的web 目录 (一般为C:\Inetpub\wwwroot) 的 Forums 目录中.
  • 打开你的IIS 管理器,为这个Forums 目录创建一个虚拟目录
  • 找到 \forums_latest_source\ASP.NET Forums 目录中的 ASP.NET Forums.sln 文件,双击, 应该没什么问题就可以打开了
  • 由于编码的问题. 工程一开始是不能编译的. 有一个地方要改一下.
  • orums_latest_source\ASP.NET Forums\Controls\Navigation\JumpDropDownList.cs  中的69,75,81 行的“?”号,改为 “引号” , 这样就可以正常编译了

第三步

修改Web.config 文件

  • 因为我们使用的是Sql Server 数据库,只要把providers>SqlForumsProvider > ^SqlConnectionString^ 字段修改一下.也就是你的数据库连接字符串 (如咧嘴笑脸ata source=192.168.0.1;user id=sa;password=password;initial catalog=ASPForumDB;Connect Timeout=30)
  • 修改compilation 中的 debug 为 true ,后面我们要调试工程
  • 到这里,已经可以运行了. 把 Defualt.aspx 设为启动文件, 按下F5 , 应该看到界面了.

第四步

处理一些BUG

  • 运行后我们发现,注册用户很正常, 但注册的用户就是登录不上. 为什么呢?可能是作者发布的比较急有些地方没有处理好.
  • 找到 forums_latest_source\ASP.NET Forums\Components \users.cs 文件的843 行
     user.Password = Encrypt(Globals.GetSiteSettings().PasswordFormat, password, user.Salt); 修改为
     user.Password = Encrypt(Globals.GetSiteSettings().PasswordFormat, password, "") ;
  • 然后重新编译系统.
  • 重新注册一个用户, 试一下登录,应该可以了

第五步

添加管理员

  • 打开你的SQL 查询分析器, 连接 AspForumDB 数据库, 运行"elect UserId from Forums_Users where UserName='管理员帐号'"  得到一个UserId 号
  • 然后运行 "exec forums_Roles_AddUser UserId ,1"

因为只是安装了一下,功能基本上都可以使用了. 有什么问题以后再补充吧.

posted on 2004-03-23 15:59:00 by aspdian  评论(49) 阅读(7281)

File Download 问题解决!

我们在编写一些文档管理的项目时一定会有这样的问题。想控制客户下载的文件和下载次数,以及下载的时段。

比较好的方法是:使用ActiveX 控件就象 http://www.gotdotnet.com 中的代码共享。

通常我们不会选择怎么复杂的方案。

我的解决方案是:

在系统的 非Web 目录中存放文件,文件名已经经过了编码(主要是安全的考虑),当然我们也可以对文件内容进行加密。把真实的文件名放在数据库中(这样比把文件放在数据库上,如果客户有一个1G的文件,那你只有哭了 )。

用户下载的链接如下:

http://www.test.org/filedownload.aspx?e6feeccd90a9463d93b9dc231115bbb9  (是不是很象MS 的下载中心)

代码:

  private void Page_Load(object sender, System.EventArgs e)
  {
   //读取文件
   if (null!=Page.Request.Url.Query )
    // 请求字符串为

    FileGuid = Page.Request.Url.Query.Substring (1); // fileGuid= e6feeccd90a9463d93b9dc231115bbb9

   // Globals.fileLibDir 就是那个我们存放文件的目录
   if (!File.Exists(Globals.fileLibDir + FileGuid))
   {
    // 文件没有找到
    Page.Response.Redirect ("error.aspx?msg=文件不存在",true );

    return;
   }

   // 真实的文件名
   string fileName = getFileNameByStorageName(FileGuid);
   if (fileName == string.Empty  )
   {
    //文件没有找到
    Page.Response.Redirect ("error.aspx?msg=链接错误,请与管理员联系!",true );
    return;
   }

   Page.Response.ContentType="APPLICATION/OCTET-STREAM";
   // 注意下面的Encode 编码,不然无法处理中文文件名
   Page.Response.AddHeader("Content-Disposition","attachment; filename=" + HttpUtility.UrlEncode(fileName,Encoding.UTF8 ) );
   Page.Response.WriteFile ( Globals.fileLibDir + FileGuid);
   
  }

 

posted on 2004-03-22 10:52:00 by aspdian  评论(20) 阅读(6235)

Forum 2.0 latest source Code !

今天收到了 Forum 2.0 Latest Source Code ,不知道是不是最终版本了. 是 2004 年3月19 日打包的.

记得 Forum 1.0 beta 1 发布的时候我还在学校, 可以说Asp.net Forum  是我学习 ASP.Net 的启蒙教程. 甚至自己还学着他的代码,写了一个小Forum. 这个版本的ASP.Net Forum 2.0 的代码我还没有看,但我想一定会有所收获的。

因为我的项目在紧张的进行中,所以也就很少有精力来写技术文章。

Forum 2.0 latest source Code DownLoad ! 3915KB

 

posted on 2004-03-21 10:18:00 by aspdian  评论(18) 阅读(6683)

ASP.NET Resource Kit Released. Download IT!

The ASP.NET Resource Kit is an essential resource for any web developer whether you're already using ASP.NET today, or looking to learn ASP.NET.

 

 

 

posted on 2004-02-27 16:59:00 by aspdian  评论(4) 阅读(2657)

谈谈网站的 Passport 实现.

看了思归的文章,感觉很有挑战性.就以Demo 的形式做了一个简单的实现. 自己来写一个Passport 服务器. 

第一个问题:

    用户的信息的处理.Passport 服务器来处理这些信息,当然了只会是一些简单的用户信息. 比如说性别,电话等

第二个问题:

    Passport 服务器与 应用程序之间的数据交换. 看了 MS 的Passport SDK ,发现远没有我们想象的简单.MS 使用了COM 与 Passport 服务进行数据交流, 我们在短时间内也不太可能编写一个 COM 组件来处理.  当然想到了WEB 程序常用的cookie ,因为在DotNet 中的(From 验证模式)中也使用了cookie , 可是因为域的问题.在两个不在同一台机器上的程序是无法共享cookie 的(我没有找到过好的方法).所以我想到了 查询字符串.

第三个问题:

Ticket 的生成.当Passport 生成验证 Ticket 后,把Ticket 信息回发(使用“查询字符串“眨眼笑脸给请求应用程序.应用程序把Ticket 写入cookie (这是应用程序的cookie ,当应用程序使用它时不会有域的问题).  这个 MyPassportAuthenticationTicket 类要自己来写. 如果你想用 FormsAuthenticationTicket 不代替的话也是可以的,但要自己来对它进行加密传送.如果你想用FormsAuthentication.Encrypt方法 那是不行的.因为它的加密算法中加入了服务器machineKey .

第四个问题:

自己来实现一个PassportIdentity ,把功能进行一个封装.实现其中的 LogoTag2 方法.来生成一个登录链接.

最后一个问题:

就是不断完善了,不过有系统还有一个点问题,明眼人一看就知道了,返回链接参数的保持问题.

 

不知道,有没有更好的方法. 大家一起来讨论一下.

posted on 2004-02-27 08:52:00 by aspdian  评论(18) 阅读(4283)

ASP.net Application 中使用域用户登录

  现在做的一个程序中要求ASP.net 程序可以使用已经存在的域用户来登录(而且为了与其它程序界面一致一定要使用 Forms 登录),查找了一些相关的资料发现还是可以实现的。

   主要还是依靠 advapi32.dll 中的 LogonUser API 函数。

using System.Web.Security;
using System.Runtime.InteropServices;

[DllImport("advapi32.dll", CharSet=CharSet.Auto)]
public static extern int LogonUser(String lpszUserName,
String lpszDomain,
String lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);

public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;

void Login_Click(Object sender, EventArgs E)
{
IntPtr token = IntPtr.Zero;

if(LogonUser(UserName.Value,
UserDomain.Value,
UserPass.Value,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
ref token) != 0)
{
FormsAuthentication.RedirectFromLoginPage(UserName.Value,
PersistCookie.Checked);
}
else
{
lblResults.Text = "Invalid Credentials: Please try again";
}
}
 

   其它方面的使用与普通的forms 程序没有太大的区别,也许还有更好的方法。

posted on 2003-12-01 15:37:00 by aspdian  评论(10) 阅读(5195)

ASP.NET Forums V2.0 beta

       今天收到一个朋友发给我的邮件,附件是www.asp.net 网站上所使用的那个开发源代码的论坛系统。不同的是它是 2.0 版本,正在开发中。是一个 beta 版本(源代码版本)。大家也可以下载下来看看,有很多的改进。它也使用了FreeTextBox 控件。:)

posted on 2003-11-28 08:44:00 by aspdian  评论(3) 阅读(2013)

Code Tools (FxCop and Reflector )

FxCop 1.23

    FxCop is a code analysis tool that checks .NET managed code assemblies for conformance to the Microsoft .NET Framework Design Guidelines. It uses reflection, MSIL parsing, and callgraph analysis to inspect assemblies for more than 200 defects in the following areas: naming conventions, library design, localization, security, and performance . FxCop includes both GUI and command line versions of the tool, as well as an SDK to create your own rules.

Reflector for .NET

    Reflector is a class browser, decompiler and XML documentation browser for .NET components (assemblies). It features assembly and namespace views, type and member search, reference search, IL disassembler, C# decompiler, VB decompiler, C# XML documentation viewer, MSDN help viewer, dependency trees, supertype/subtype hierarchies and resource viewers. Function prototypes are displayed in C# and VB syntax.

posted on 2003-10-29 08:41:00 by aspdian  评论(2) 阅读(2093)

如何提高 ASP.Net 应用程序的性能

最近在开发一个专业的网站,在工作完成后对性能进行了一些测试与分析。发现很多值得我们注意的地方。

  系统有三层:Control (UI ) DataProvider (Data) Components (Base)

    后台使用MS Sql Server 2000 ,数据层通过 存储过程来完成所有的数据操作。并编写了一个IDataProvider 接口来定义所有的操作。UI 层只是通过调用IDataProvider 来实现所有的功能。

一开始我们使用的方法:

SqlDataProvider dp = new SqlDataProvider();
dp.Data_registerUser (User user);

   这样就有了一个问题,当一个页面包含大量
控件时,会产生很多的SqlDataProvider 对象,而SqlDataProvider 运行库到项目后期已经非常庞大(已经达到250K左右)。这样在.NET 中已经算80K以上的大对象了。大量创建大对象会非常严重地影响性能。

   那就没有好的方法来解决一下吗?其实,我们不需要创建怎么多对象的。只要有一个SqlDataProvider 对象在内存中就可以了。这样我们想到了 ASP.NET 中的 System.Web.Caching.Cache 类,我们对代码进行了修改。添加了一个类。

//---------------  缓冲 SqlDataProvider.SqlDataProvide ----
public class DataProvider
{
public static IDataProvide Instance()
{

Cache cache = System.Web.HttpContext.Current.Cache;

if ( cache["IDataProviderBase"] == null )
{

String assemblyPath = "SqlDataPrvider.dll"; 
String className = "SqlDataProvider.SqlDataProvide";
assemblyPath = HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath + "/bin/" + assemblyPath);
try
{
cache.Insert( "IDataProvide", Assembly.LoadFrom( assemblyPath).GetType( className ).GetConstructor(new Type[0]), new CacheDependency( assemblyPath ) );
}
catch (Exception)
{
HttpContext.Current.Response.Write("<b>ERROR:</b> Could not locate file: <code>" + assemblyPath + "</code> or could not locate class <code>" + className + "</code> in file.");
HttpContext.Current.Response.End();
}
}
return (IDataProvide)( ((ConstructorInfo)cache["IDataProvide"]).Invoke(null) );
}
}

//--------------修改后的代码------
IDataProvide dp = DataProvider.Instance();
dp.Data_registerUser (User user);

 

   通过改造,系统性能得到很大的提高。但系统还有几个可以进行性能优化的地方。如:常用数据的缓冲,分页数据存储过程等。

posted on 2003-10-29 08:39:00 by aspdian  评论(11) 阅读(4527)

Using log4net

 很多开发者都想要一个非常强大的程序日志管理库,能够了解用户对应用程序的使用情况。当程序出现问题时,可以通过分析日志来了解问题之所在。
    过去我们总是用一种很简单的方式来处理日志,即:使用一个日志文件,当程序有问题时就要求用户提供这个文件。但常常日志文件不是没有,就是已经被删除。

 Log4net 是著名的 log4j for Java 项目的一部分。它是由 www.neoworks.com 的一个团队开发出来,支持多种方式的日志。如 ADO (MS Sql Server 等),File (文件), Console (控制台),EventLog (系统日志),SMTP(邮件方式)...

而且支持所有的.Net 平台:

  • Microsoft .Net Framework 1.0 (1.0.3705)
  • Microsoft .Net Framework 1.1 (1.1.4322)
  • Microsoft .Net Compact Framework 1.0 (1.0.5000)
  • Mono 0.25 or higher (Linux 下的)
  • Microsoft Shared Source CLI 1.0 (就是MS 开发源代码的 .Net 运行库)

 如果你要了解更详细的信息:
  log4net Site  (好象下载有点问题,怎么也下载不了。也有可能是我这边网络的问题)
  Using  log4Net  (一篇很专业的使用指南,花了不少时间才找到的)
  log4net.dll  (我找到的编译好的 log4net.dll 文件,可以直接加入你的工程。)

posted on 2003-10-24 17:30:00 by aspdian  评论(6) 阅读(9045)

Powered by: Joycode.MVC引擎 0.5.2.0