前两篇介绍了:TaskVision自动更新与本地化。这两个功能比较独立,通常我们可以在软件开发完毕后加上,所以从该篇开始,小菜会将这两部份功能去掉,直到最后才会加上。

(一)、引言
TaskVision用户验证采用加密过后的身份验证票(FormsAuthenticationTicket+FormsAuthentication),客户端可通过注册表保存使用DataProtection加密过后的密码。

(二)、效果
正确帐号与密码如下:
帐号:jdoe
密码:welcome

输入帐号与密码:aa,bb
 TaskVision用户验证
注意了:小菜演示时,密码文本框暂时没有使用PasswordChar属性,为了让大家可以看清输入的密码。

登录提示:
TaskVision用户验证

停止IIS站点提示:
TaskVision用户验证 

输入帐号与密码:jdoe,welcome,选择记住密码,则将帐号与密码保存到注册表,下次就不用输写。
TaskVision用户验证

登录成功,在工具栏的右边显示用户全名。
TaskVision用户验证

小菜自定义数据验证控件来增强用户体验:(小菜自我感觉良好,代码很清晰,扩展性也不赖。)
 TaskVision用户验证
你可能会觉得,噢,不过是使用了HelpProvider组件而已,是使用了HelpProvider,但不是而已。(之后会详细介绍自定义数据验证控件)

代码下载:https://files.cnblogs.com/a-peng/SmartClient_Chapter03.rar

(三)、分析

1、数据库部份:

从该篇开始,我们将涉及到TaskVision数据库了,小菜会陆续给出相关表与存储过程。
该篇主要涉及:Users表(用户表)

列名 数据类型 长度 允许空 描述
UserID int 4   主键,自动编号
UserName varchar 16   用户名称
UserPassword varchar 16   用户密码
UserFullName varchar 50   用户全名
UserEmail varchar 50   用户邮箱
IsAccountLocked bit 1   帐号是否锁定,默认值(0)
IsAdministrator bit 1   用户是否具有管理权限,默认值(0)
DateCreated datetime 8   用户创建时间,默认值(getdate())

数据库中已有内容:

TaskVision用户验证 
存储过程:
AuthenticateUser用户验证:

TaskVision用户验证CREATE PROCEDURE AuthenticateUser
TaskVision用户验证(
TaskVision用户验证  
@UserName varchar(16),
TaskVision用户验证  
@Password varchar(16)
TaskVision用户验证)
TaskVision用户验证
AS  
TaskVision用户验证
SELECT  UserID
TaskVision用户验证
FROM    Users
TaskVision用户验证
WHERE   (UserName = @UserName AND cast(UserPassword as varbinary= cast(@Password as varbinaryAND IsAccountLocked = 0)
TaskVision用户验证

使用cast(UserPassword as varbinary)表示将密码使用二进制进行比较,可以区分大小写,如welcome != Welcome

GetUserInfo取用户信息

TaskVision用户验证CREATE PROCEDURE [GetUserInfo]
TaskVision用户验证(
TaskVision用户验证    
@UserID int
TaskVision用户验证)
TaskVision用户验证
AS
TaskVision用户验证
SELECT  UserID, UserName, UserFullName, UserEmail, IsAdministrator, IsAccountLocked
TaskVision用户验证
FROM    Users
TaskVision用户验证
WHERE   (UserID = @UserID)


2、Web服务部份
我们创建了Web站点TaskVisionWS,添加了用于用户验证的Web服务:AuthService.asmx。

数据库相关操作使用:SqlHelper。
该SqlHelper来自Enterprise Library2.0(企业库2.0)中的Microsoft Data Access Application Block(数据访问应用程序块)

企业库中的SqlHelper比PetShop中的SqlHelper功能更强些,连参数都可以不会写。很好很强大。
大家有时间可以看看其源码,不会太难。

题外话:小菜经常逛TerryLee(李会军)的博客,TerryLee写过一个系列:Enterprise Library系列文章回顾与总结
之前一直被Enterprise Library的名字吓到,不敢看,呵,希望大家不要和我一样,勇敢点,你会发现没什么的。
Enterprise Library2.0为微软开源的.Net企业库,包含有:数据访问程序块,日志应用程序块,异常应用程序块,缓存应用程序块,安全应用程序块,加密应用程序块。
可以从这里下载到:http://msdn.microsoft.com/en-us/library/aa480453.aspx 而且都带有例子QuickStartSamples

AuthService.asmx源码:

TaskVision用户验证public class AuthService : System.Web.Services.WebService
}

从userID = SqlHelper.ExecuteScalar(m_conn, "AuthenticateUser", userName, userPassword).ToString(); 我们可以看到使用企业库中的SqlHelper执行存储过程,可以不用写参数。感兴趣的朋友可以看看其源码噢。

3、本地应用程序部份
本地应用程序引用Web服务AuthService.asmx,名称为AuthWS

我们创建DataLayer类来封装对Web服务的调用。

TaskVision用户验证using System;
TaskVision用户验证
using TaskVision.AuthWS;
TaskVision用户验证
TaskVision用户验证
namespace TaskVision

你会发现,小菜注释了一部份代码,为何呢?
Web服务的地址会改变,如果我们将其Url地址固定在程序中,会带来很多不便,所以我们通常会将其放在配置文件中如app.Config,然后读取。所以也就有了上面的InitAuthServiceProxy(AuthService service)来初始化该Web服务。然而在.Net2.0中,当我们引用Web服务,VS2005就会自动将引用地址写入app.Config配置文件中,所以无需我们做这部份的内容了。配置文件内容如下:

TaskVision用户验证<?xml version="1.0" encoding="utf-8" ?>
TaskVision用户验证
<configuration>
TaskVision用户验证    
<configSections>
TaskVision用户验证        
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
TaskVision用户验证            
<section name="TaskVision.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
TaskVision用户验证        
</sectionGroup>
TaskVision用户验证    
</configSections>
TaskVision用户验证    
<applicationSettings>
TaskVision用户验证        
<TaskVision.Properties.Settings>
TaskVision用户验证            
<setting name="TaskVision_AuthWS_AuthService" serializeAs="String">
TaskVision用户验证                
<value>http://localhost/TaskVisionWS/AuthService.asmx</value>
TaskVision用户验证            
</setting>
TaskVision用户验证        
</TaskVision.Properties.Settings>
TaskVision用户验证    
</applicationSettings>
TaskVision用户验证
</configuration>

如果你对VS2005自定生成的配置文件代码很不满意的话,那你可以使用如下配置文件,然后把代码的注释部份去掉,小菜已经为你准备好了。 :)

TaskVision用户验证<?xml version="1.0" encoding="utf-8" ?>
TaskVision用户验证
<configuration>
TaskVision用户验证    
<appSettings>
TaskVision用户验证        
<add key="AuthService" value="http://localhost/TaskVisionWS/AuthService.asmx"/>
TaskVision用户验证    
</appSettings>
TaskVision用户验证
</configuration>

接下来看看用户登录窗体的代码:

TaskVision用户验证using System;
TaskVision用户验证
using System.Windows.Forms;
TaskVision用户验证
TaskVision用户验证
using Microsoft.Win32;
TaskVision用户验证
TaskVision用户验证
namespace TaskVision
}

你会看到在btnOk_Click中有这句代码:if (fvLoginForm.IsValid) { } fvLoginForm为自定义数据验证控件,具体的分析小菜下篇会写,感兴趣的可以先查看小菜的源码。这里表示当帐号与密码两个文本框输入不为空时返回true。

主窗体:

TaskVision用户验证public partial class MainForm : Form
}

 

*************************************************************************
作者:a-peng
出处:
http://a-peng.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出
原文连接,否则保留追究法律责任的权利。
*************************************************************************

相关文章:

  • 2022-01-16
  • 2021-07-15
  • 2021-06-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-16
  • 2021-12-20
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-03-07
  • 2021-05-20
  • 2022-02-03
相关资源
相似解决方案