FormsAuthenticationTicket基于forms的验证

发布于:
Microsoft.Net

构建基于forms的验证机制过程如下:

1,设置IIS为可匿名访问和asp.net web.config中设置为form验证

2,检索数据存储验证用户,并检索角色(如果不是基于角色可不用)

3,使用FormsAuthenticationTicket创建一个Cookie并回发到客户端,并存储
角色到票据中,如:
FormsAuthentication.SetAuthCookie(Username,true | false)
cookies保存时间:
HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName].Expires=DateTime.Now.AddDays(1)

如果需要存储角色,采用:
FormsAuthenticationTicket authTicket = new
FormsAuthenticationTicket(
1, // 版本号。
txtUserName.Text, // 与身份验证票关联的用户名。
DateTime.Now, // Cookie 的发出时间。
DateTime.Now.AddMinutes(20),// Cookie 的到期日期。
false, // 如果 Cookie 是持久的,为 true;否则为 false。
roles ); // 将存储在 Cookie 中的用户定义数据。
roles是一个角色字符串数组
string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //加密

存入Cookie
HttpCookie authCookie =
new HttpCookie(FormsAuthentication.FormsCookieName,
encryptedTicket);

Response.Cookies.Add(authCookie);
4,在Application_AuthenticateRequest事件中处理程序中(Global.asax)中,使用
票创建IPrincipal对象并存在HttpContext.User中
代码:
HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);//解密
string[] roles = authTicket.UserData.Split(new char[]{‘;’});//根据存入时的格式分解,;或|….
Context.User = new GenericPrincipal(Context.User.Identity, Roles);//存到HttpContext.User中

判断某个角色验证
HttpContext.Current.User.IsInRole(roles)
具体实现

Web.config文件
加入节点,name为COOKIE名称,loginUrl为没有通过验证跳转的地址
<system.web>
<authentication mode=”Forms”>
<forms name=”Hstear”
loginUrl=”login.aspx” protection=”All” path=”/” timeout=”40″/>
</authentication>
</system.web>
设置目录访问 path为目录名,roles为票据中的角色名
发现网上的都说要单独一个WEB.CONFIG文件放在目录中,但实际在根目录中设置即可,单个文件也一样
<location path=”Admin”>
<system.web>
<authorization>
<allow roles=”admin”/>
<deny users=”*”/>
</authorization>
</system.web>
</location>
Global.asax文件
Application_AuthenticateRequest事件中加入

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
 		{
 string cookieName = FormsAuthentication.FormsCookieName;
 HttpCookie authCookie = Context.Request.Cookies[cookieName];
 FormsAuthenticationTicket authTicket = null;
 try
 {
     authTicket = FormsAuthentication.Decrypt(authCookie.Value);
 }
 catch(Exception ex)
 {
     return;
 }
 
 string[] roles = authTicket.UserData.Split(new char[]{','});//如果存取多个角色,我们把它分解
 
 FormsIdentity id = new FormsIdentity( authTicket );
 
 GenericPrincipal principal = new GenericPrincipal(id, roles);
 Context.User =principal;//存到HttpContext.User中
 
 		}

自制ADSL分离器(转)

发布于:
其他(计算机)

装了ADSL以后,上网时打电话成了问题,别的房间一接电话就断网。更要命的是电话里有鸡鸡哇哇的怪声。在进线上装分离器的方法不太可行,几万块装修的房子,是在墙上布线呀还是在墙上打洞洞呀!没法子,只能买它两三个分离器。去电信局一吧,至少要50元一个!抢劫啊。一个也不要买,市场上一问也是50,都是奸商啊。不如自己动手做一个吧。

SPA-1001, PAP2, PAP2T, SPA2102, SPA3102 区别

发布于:
其他(计算机)

Here's some info on the different Linksys adapters:

The SPA-1001 has been discontinued and is replaced with the PAP2T.

The PAP2 has been discontinued and is replaced with the PAP2T.

The PAP2T is the latest model 2 FXS adapter from Linksys.

The SPA2102 is the latest model 2 FXS, router, adapter from Linksys.

The SPA3102 is the latest model 1 FXO, 1 FXS, router, adapter from Linksys.

-NA or -EU means that the device is not associated with a particular VoIP provider (unlocked). Devices without -NA or -EU usually have another -XX designation and are locked to a specific VoIP Provider.

If you are looking to purchase used equipment, make sure it is a -NA or -EU model. Other models are not truely "unlocked" and will not be supported by Linksys or other prodivers.

More information and data sheets for the PAP2T-NA, SPA2102, and SPA3102-NA are available on our store pages.

重新安装 Microsoft SQL Server 2008 Express R2 的悲剧

发布于:
Microsoft.Net

安装完 Visual Studio好像就安装了 Microsoft SQL Server 2008 Express 但是今天用的时候没找到 管理工具。。去下管理工具的时候。。发现出现了R2新版本。于是就想卸载重新装。

这下倒好。死活装不上。于是根据提示开始排错。

错误提示定位到 dw20shared.msi ,把他从安装目录拷贝出来。运行。

又提示“系统管理员设置了系统策略禁止进行此安装”,google一搜,出来千万条。不外乎改策略。注册表之类。天下网络一大抄嘛。统统的。无效!!如此反复。甚是疲惫..遂放弃。来看看是不是软件的问题。

于是我仔细端详这块软件,看他说明,曰“Microsoft Application Error Reporting”,想,是不是SQL没阉割干净呢,关于阉干净引来的问题以前倒是遇到过不少。开注册表搜索。。。果然。。然后。。当然阉了他。。

Microsoft Application Error Reporting 注册表项
000021599B0090400000000000F01FEC
95120000-00B9-0409-0000-0000000FF1CE

现运行。dw20shared.msi。不报错。。哈哈。。问题找到(还得再清一次注册表,因为我运行了一次安装文件)。。。

再安Microsoft SQL Server ,豁然。。。开朗!!!

终于,安装。完成 !!!

(转)C#.NET使用TTS引擎实现文语转换

发布于:
Microsoft.Net

本文讲述使用微软TTS5.1语音引擎(中文)实现文本阅读和音频输出为WAV完美解决方案。

网上很多文章说的是要安装SAPI.51 SDK,而这个东西有好几十M,并且用起来比较复杂。微软官方网站上是这样写的:SAPI5.1 SDK可以从微软网站下载:http://www.microsoft.com/speech/download/sdk51/ 需要安装程序的有Speech SDK 5.1(68M)和5.1 Language Pack (81.5M)。本文使用不到2M的东西实现文语转换,可以说是有关TTS的完美版本!

功能:
进行中文文本的阅读,可以将阅读的语音输出为WAV音频。

实现平台:
Microsoft Visual Studio 2005
微软TTS5.1语音引擎(中文)

所需要的东西:

用TlbImp从SAPI.51 SDK中导出的DotNetSpeech.dll(160K)
微软TTS5.1语音引擎(中文).msi(1.55M)

以上两个东西由于大小关系没有传上来,需要的可以留下邮箱地址。

如果你自己安装了SAPI.51 SDK,可以使用这个命令自己导出DotNetSpeech.dll

Tlbimp sapi.dll /out: DotNetSpeech.dll(出现错误不用管,不影响使用)

安装微软TTS5.1语音引擎(中文).msi,打开”控制面板”,打开”语音”配置项目,在”文字-语音转换”的”语音选择”组合框中选择”Microsoft Simplified Chinese”,这样才可以读出中文。如果要读英文,要选择”Microsoft Sam”。

IP地址与整数的互换算法[转]

发布于:
Microsoft.Net

由于常规的IP地址(IPV4),是点分十进制表示的,是由4段 0 ~255 之间的10进制数表示的。所以,很明显的可以得出 IP地址实际上是一个32位正整数 。在C#中,uint的取值范围是 0 ~ 4,294,967,295,所以,可以完全胜任了。

但是,由于数据库中的数据类型和C#的数据类型的对应关系,有所差异,如果要考虑到存储到数据库中,那么需要考虑使用bigint的方式(特指SQL SERVER),对应于C#中,我们使用long类型。

/// <summary>
/// 将IP地址转为数值形式
/// </summary>
/// <returns>长整数</returns>
public static long ToDigit(IPAddress ip)
{
    int x = 3;
    long l = 0;
    foreach (byte b in ip.GetAddressBytes())
    {
        l += (long)b << 8 * x--;
    }
    return l;
}

/// <summary>
/// 将数值转换为IP地址
/// </summary>
/// <returns>IP地址</returns>
public static IPAddress ToIP(long l)
{
    var bt = new byte[4];
    for (int i = 0; i < 4; i++)
    {
        bt[3 - i] = (byte)(l >> 8 * i);
    }
    return new IPAddress(bt);
}

 

 

Eclipse快捷键大全(转载)

发布于:
Java

Ctrl+1 快速修复(最经典的快捷键,就不用多说了)
Ctrl+D: 删除当前行
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交互位置(同上)
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)
Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性
Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)
Shift+Ctrl+Enter 在当前行插入空行(原理同上条)
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)
Ctrl+/ 注释当前行,再按则取消注释
Ctrl+O 快速显示 OutLine
Ctrl+T 快速显示当前类的继承结构
Ctrl+W 关闭当前Editer
Ctrl+K 参照选中的Word快速定位到下一个
Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)
Ctrl+/(小键盘) 折叠当前类中的所有代码
Ctrl+×(小键盘) 展开当前类中的所有代码
Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)
Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)
Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)
Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)
Ctrl+Shift+F4 关闭所有打开的Editer
Ctrl+Shift+X 把当前选中的文本全部变味小写
Ctrl+Shift+Y 把当前选中的文本全部变为小写
Ctrl+Shift+F 格式化当前代码
Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)

Java 专业人士必备的书籍和网站列表

发布于:
Java

本文作者:Roy Miller (roy@roywmiller.com), 创始人兼总裁, The Other Road, LLC

简介: 对于 Java™ 语言开发人员来说,信息过量是一个真正的问题。每个新入行的程序员都要面临一个令人畏缩的挑战:要进入的行业是一个具有海量知识的行业。要了解的东西简直太多了。对于有经验的老手来说,情况只有些微好转。知识量总在增大,仅仅跟上进度就是一个挑战。如果有一份专业人士必备的书籍和网站列表该有多好!本文就是这个列表。它包含了每个专业的 Java 语言程序员在书架或浏览器书签中必备的最重要的书籍和网站。

这些都是您书架上必备的书和应该经常使用的 Web 链接。时间是一项重要的资源,本文帮您回避那些分心的事情,把时间专注于最有益于您作为Java 语言程序员职业生涯的信息源。尽管有多少程序员就有多少他们最喜欢的参考资料,但本文收集的这些都是优中选优,来源于我书架上的私家珍藏和许多 Java 专家的推荐。

我考虑了两种组织这份参考资料列表的方法。我本可以通过主题领域来组织,这也许很有帮助,但主题列表很快就会变得不实用。相反,我选择了另一种方法:通过类型来组织,即书籍和 Web 站点。

总的来讲,有经验的老手们用 Web 站点来跟踪行业的走势。书籍、文章和论文有助于跟上潮流,但它们总体上更适合于基础学习。极富创造性的书籍偶尔会撼动一两个基础性的东西。这样的书也在本列表之列。

需要提出的一点警告是,专注于 Java 语言的书籍和 Web 站点数量巨大。您钟爱的未必在这份列表里。那并不意味着它们不好。它们只是不在这份列表里而已。可能是因为我还不知道它们。也可能是因为我不认为它们能够算得上是重要资源。不包含一些参考资料是一个评判问题,但如果不这样的话,您也许就要花几小时来拖动滚动条,还要花上成千上万美元来买书。如果您作为一个专业的 Java 程序员,有一些常用的优秀参考资料,一定要让我知道这些资料。这份列表一直都在更新中,您提出的那些也许就会被收录进去。

解决iTunes10在Windows2003下无法安装的问题

发布于:
其他(计算机)

在Windows 2003下安装会出现的问题:

  1.驱动装不上,提示要WinXP SP1及以上版本,显然是把Server版给蔽掉了;这个装不上对于机上上没有老版本的玩家那可是致命的。

  2.iTunes装到最后,启动iPodService时,哐,弹出一个应用程序错误。对于编程的人来说,就跟读了空指针一样。最后无法安装通过。

  我在网上找了一大圈,都没法完全的解决问题。

  对于第一个问题,方法是一致的,确实能解决问题,用Orca这个工具。但对于第二个问题都没法完全解决,在我的机子上行的通的一个方法是安装到启动 iPodService时将旧版本的iPodService.exe替换到安装文件夹中,这样可以欺骗过去,但由于iPodService.exe用的是老版本的,所以功能会有缺陷,至于会不会使软件变得不稳定,那就不清楚了,我也懒得去试。

下面是我的具体解决方案:

  1.将iTunes解压到一个文件,例如C:iTunesSetup。会得到7个msi文件,一个SetupAdmin.exe,这个文件没用。

  2.用Orca工具打开AppleMobileDeviceSupport.msi,找到LaunchCondition,将Condition中的 ((VersionNT=501 AND ServicePackLevel>=2) OR VersionNT>=600)改为((VersionNT=501 AND ServicePackLevel>=2) OR VersionNT>501)。VersionNT代表的是当前操作系统的版本号,501是XP,502是2003,600是Vista(猜的,因为我的VS2005MSDN上没有600版本)。再点View->Summary Information…,将Languages项改为1033,其他的不留,不然安装的时候还会出问题,这个问题应该是由于系统不是英文版的问题,反正这东西是是驱动,中文的还是英文的不会影响iTunes的使用。修改完之后保存。

  3.AppleMobileDeviceSupport.msi,iTunes.msi的修改类似步骤2。

  4.重新安装(因为我首次安装出错,所以现在是重新装) AppleMobileDeviceSupport.msi,AppleMobileDeviceSupport.msi,iTunes.msi,iTunes装到最后,启动iPodService时,哐,弹出一个应用程序错误。。仍然,不管他。。。结束掉iPodService.exe进程。(如果你是iphone或者其他设备,文件名和路径或许不同,我没测试过。因为我只有ipod,就是这个文件名,自己变通一下吧。)

  5.UltraEdit打开C:Program FilesiPodbiniPodService.exe,。(如果你是iphone或者其他设备,文件名和路径或许不同,我没测试过。因为我只有ipod,就是这个文件名,自己变通一下吧。)

  将6A 01 6A 02 6A 00 6A 00 C7替换为6A 03 6A 02 6A 00 6A 00 C7,在将6A 01 6A 01 52 50 FF D6 52替换为6A 03 6A 01 52 50 FF D6 52。因为这里在比较版本号的时候用了相等比较,改了之后版本的比较就是大于等于比较了,这样Windows 2003也能比较通过了。修改完之后保存,如果没有其他问题,估计就可以使用iTunes了。。。

  以上用到的工具除了UltraEdit,其他的都是可以从M$那里得到。对于UltraEdit你也可以选择用其他的十六进制编辑器,只要能查找替换就行了。

  我用的iTunes的版本为10.0.1.22,第5步涉及到iPodService.exe的实现,所以版本不同可能找不到对应的字节,如果他们不更改系统版本判断的代码,应该还是可以继续使用第5步。

  本文根据 icedream – C++博客 文章修改。换汤不换药.

SQLiteMembershipDb

发布于:
Microsoft.Net

 SQLite 版的Membership的数据库内容。本来打算做一个SQLite 版的Membership,在基本完成时发现,确实不能满足项目需要,所以留在这里存档。以备后用,或者网友需要。呵呵。。 

PRAGMA foreign_keys=ON;
BEGIN TRANSACTION;
CREATE TABLE "aspnet_WebEvent_Events"(
	"EventId" NVARCHAR(32) NOT NULL,
	"EventTimeUtc" DATETIME NOT NULL,
	"EventTime" DATETIME NOT NULL,
	"EventType" NVARCHAR(256) NOT NULL,
	"EventSequence" DECIMAL(19, 0) NOT NULL,
	"EventOccurrence" DECIMAL(19, 0) NOT NULL,
	"EventCode" INTEGER NOT NULL,
	"EventDetailCode" INTEGER NOT NULL,
	"Message" NVARCHAR(1024) NULL,
	"ApplicationPath" NVARCHAR(256) NULL,
	"ApplicationVirtualPath" NVARCHAR(256) NULL,
	"MachineName" NVARCHAR(256) NOT NULL,
	"RequestUrl" NVARCHAR(1024) NULL,
	"ExceptionType" NVARCHAR(256) NULL,
	"Details" TEXT NULL,
  PRIMARY KEY("EventId")
);
CREATE TABLE "aspnet_Applications"(
  "ApplicationName" NVARCHAR(256) NOT NULL DEFAULT '' COLLATE NOCASE,
  "LoweredApplicationName" NVARCHAR(256) NOT NULL DEFAULT '' COLLATE NOCASE,
  "ApplicationId" NVARCHAR(40) NOT NULL COLLATE NOCASE,
  "Description" NVARCHAR(256) NOT NULL DEFAULT '' COLLATE NOCASE,
  PRIMARY KEY  ("ApplicationId")
  ----FOREIGN KEY("ApplicationId") REFERENCES "aspnet_Membership"("ApplicationId"),
  ---FOREIGN KEY("ApplicationId") REFERENCES "aspnet_Paths"("ApplicationId"),
  ---FOREIGN KEY("ApplicationId") REFERENCES "aspnet_Roles"("ApplicationId"),
  ---FOREIGN KEY("ApplicationId") REFERENCES "aspnet_Users"("ApplicationId")
);
CREATE TABLE "aspnet_Paths"(
	"ApplicationId" NVARCHAR(256) NOT NULL DEFAULT '' COLLATE NOCASE,
	"PathId" NVARCHAR(40) NOT NULL DEFAULT '' COLLATE NOCASE,
	"Path" NVARCHAR(256) NOT NULL DEFAULT '' COLLATE NOCASE,
	"LoweredPath" NVARCHAR(256) NOT NULL DEFAULT '' COLLATE NOCASE,
 PRIMARY KEY("PathId"),
 ---FOREIGN KEY("PathId") REFERENCES "aspnet_PersonalizationAllUsers"("PathId"),
 ---FOREIGN KEY("PathId") REFERENCES "aspnet_PersonalizationPerUser"("PathId")
 FOREIGN KEY("ApplicationId") REFERENCES "aspnet_Applications"("ApplicationId")
);
CREATE TABLE "aspnet_Users"(
	"ApplicationId" NVARCHAR(40) NOT NULL COLLATE NOCASE,
	"UserId" NVARCHAR(40) NOT NULL COLLATE NOCASE,
	"UserName" NVARCHAR(256) NOT NULL,
	"LoweredUserName" NVARCHAR(256) NOT NULL,
	"MobileAlias" NVARCHAR(16) NULL,
	"IsAnonymous" TINYINT NOT NULL DEFAULT 0,
	"LastActivityDate" DATETIME NOT NULL,
 PRIMARY KEY("UserId"),
 FOREIGN KEY("ApplicationId") REFERENCES "aspnet_Applications"("ApplicationId")
 ----FOREIGN KEY("UserId") REFERENCES "aspnet_Membership"("UserId")
);
CREATE TABLE "aspnet_PersonalizationAllUsers"(
	"PathId" NVARCHAR(40) NOT NULL DEFAULT '' COLLATE NOCASE,
	"PageSettings" BLOB NOT NULL,
	"LastUpdatedDate" DATETIME NOT NULL,
  PRIMARY KEY("PathId"),
  FOREIGN KEY("PathId") REFERENCES "aspnet_Paths"("PathId")
  );
CREATE TABLE "aspnet_PersonalizationPerUser"(
	"Id" NVARCHAR(40) NOT NULL,
	"PathId" NVARCHAR(40) NULL,
	"UserId" NVARCHAR(40) NULL,
	"PageSettings" BLOB NOT NULL,
	"LastUpdatedDate" DATETIME NOT NULL,
  PRIMARY KEY("Id"),
  FOREIGN KEY("PathId") REFERENCES "aspnet_Paths"("PathId"),
  FOREIGN KEY("UserId") REFERENCES "aspnet_Users"("UserId")
  );
CREATE TABLE "aspnet_Profile"(
	"UserId"  NVARCHAR(40) NOT NULL COLLATE NOCASE,
	"PropertyNames" TEXT NOT NULL,
	"PropertyValuesString" TEXT NOT NULL,
	"PropertyValuesBinary" BLOB NOT NULL,
	"LastUpdatedDate" DATETIME NOT NULL,
	PRIMARY KEY("UserId"),
	FOREIGN KEY("UserId") REFERENCES "aspnet_Users"("UserId")
	);
CREATE TABLE "aspnet_SchemaVersions"(
	"Feature" NVARCHAR(128) NOT NULL,
	"CompatibleSchemaVersion" NVARCHAR(128) NOT NULL,
	"IsCurrentVersion" TINYINT NOT NULL,
 PRIMARY KEY("Feature","CompatibleSchemaVersion")
);
CREATE TABLE "aspnet_UsersInRoles"(
	"UserId" NVARCHAR(40) NOT NULL COLLATE NOCASE,
	"RoleId" NVARCHAR(40) NOT NULL COLLATE NOCASE,
  PRIMARY KEY("UserId" ASC,"RoleId" ASC),
  FOREIGN KEY("RoleId") REFERENCES "aspnet_Roles"("RoleId"),
  FOREIGN KEY("UserId") REFERENCES "aspnet_Users"("UserId")
);
CREATE TABLE "aspnet_Roles"(
	"ApplicationId" NVARCHAR(40) NOT NULL COLLATE NOCASE,
	"RoleId" NVARCHAR(40) NOT NULL COLLATE NOCASE,
	"RoleName" NVARCHAR(256) NOT NULL COLLATE NOCASE,
	"LoweredRoleName" NVARCHAR(256) NOT NULL COLLATE NOCASE,
	"Description" NVARCHAR(256) NOT NULL DEFAULT '' COLLATE NOCASE,
	PRIMARY KEY("RoleId"),
	FOREIGN KEY("ApplicationId") REFERENCES "aspnet_Applications"("ApplicationId")
	);
CREATE TABLE "aspnet_Membership"(
 "ApplicationId" NVARCHAR(40) NOT NULL DEFAULT '' COLLATE NOCASE,
 "UserId" NVARCHAR(40) NOT NULL DEFAULT '' COLLATE NOCASE,
 "Password" NVARCHAR(128) NOT NULL DEFAULT '' COLLATE NOCASE,
 "PasswordFormat" INTEGER NOT NULL DEFAULT 0,
 "PasswordSalt" NVARCHAR(128) NOT NULL DEFAULT '' COLLATE NOCASE,
 "MobilePIN" NVARCHAR(16) NOT NULL DEFAULT '' COLLATE NOCASE,
 "Email" NVARCHAR(256) NOT NULL DEFAULT '' COLLATE NOCASE,
 "LoweredEmail" NVARCHAR(256) NOT NULL DEFAULT '' COLLATE NOCASE,
 "PasswordQuestion" NVARCHAR(256) NOT NULL DEFAULT '' COLLATE NOCASE,
 "PasswordAnswer" NVARCHAR(128) NOT NULL DEFAULT '' COLLATE NOCASE,
 "IsApproved" TINYINT NOT NULL DEFAULT 0 ,
 "IsLockedOut" TINYINT NOT NULL DEFAULT 0 ,
 "CreateDate" DATETIME  NOT NULL,
 "LastLoginDate" DATETIME NOT NULL,
 "LastPasswordChangedDate" DATETIME  NOT NULL,
 "LastLockoutDate" DATETIME NOT NULL DEFAULT '1983-05-06',
 "FailedPasswordAttemptCount" INTEGER NOT NULL DEFAULT 0,
 "FailedPasswordAttemptWindowStart" DATETIME  NOT NULL DEFAULT '1983-05-06',
 "FailedPasswordAnswerAttemptCount" INTEGER NOT NULL DEFAULT 0,
 "FailedPasswordAnswerAttemptWindowStart" DATETIME  NOT NULL DEFAULT '1983-05-06',
 "Comment" TEXT NULL,
 PRIMARY KEY("UserId"),
 FOREIGN KEY("UserId") REFERENCES "aspnet_Users"("UserId")
 FOREIGN KEY("ApplicationId") REFERENCES "aspnet_Applications"("ApplicationId")
);
CREATE UNIQUE INDEX "aspnet_WebEvent_Events_EventId" on "aspnet_WebEvent_Events"("EventId");
CREATE UNIQUE INDEX "aspnet_Applications_ApplicationId" on "aspnet_Applications"("ApplicationId");
CREATE INDEX "aspnet_Paths_ApplicationId" on "aspnet_Paths"("ApplicationId");
CREATE UNIQUE INDEX "aspnet_Paths_PathId" on "aspnet_Paths"("PathId");
CREATE INDEX "aspnet_Users_ApplicationId" on "aspnet_Users"([ApplicationId]);
CREATE UNIQUE INDEX "aspnet_Users_UserId" on "aspnet_Users"("UserId");
CREATE UNIQUE INDEX "aspnet_PersonalizationAllUsers_PathId" on "aspnet_PersonalizationAllUsers"("PathId");
CREATE UNIQUE INDEX "aspnet_PersonalizationPerUser_Id" on "aspnet_PersonalizationPerUser"("Id");
CREATE INDEX "aspnet_PersonalizationPerUser_PathId" on "aspnet_PersonalizationPerUser"("PathId");
CREATE INDEX "aspnet_PersonalizationPerUser_UserId" on "aspnet_PersonalizationPerUser"("UserId");
CREATE UNIQUE INDEX "aspnet_Profile_UserId" on "aspnet_Profile"("UserId");
CREATE UNIQUE INDEX "aspnet_SchemaVersions_Feature" on "aspnet_SchemaVersions"("Feature");
CREATE UNIQUE INDEX "aspnet_UsersInRoles_RoleId" on "aspnet_UsersInRoles"("RoleId");
CREATE UNIQUE INDEX "aspnet_UsersInRoles_UserId" on "aspnet_UsersInRoles"("UserId");
CREATE UNIQUE INDEX "aspnet_Roles_RoleId" on "aspnet_Roles"("RoleId");
CREATE INDEX "aspnet_Membership_ApplicationId" on "aspnet_Membership"("ApplicationId");
CREATE UNIQUE INDEX "aspnet_Membership_UserId" on "aspnet_Membership"("UserId");
COMMIT;