编写OracleMembershipProvider,让SharePoint2007使用Oralce中的用户数据实现Form验证。 (第四天)
继续完善代码,以下代码与之前的比较多了如下特性:
* 所有属性均可在web.config中配置
* 数据库操作异常写入日志
* 多了一个LogTools类,用于日志相关操作
* 自定义多个属性增加灵活性,比如可以用任意表名,
* 确定了表结构,并给出Oracle下的表创建语句( 使用本语句需要做简单修改,替换用户和表空间名)
(因为调试部署费时,所以代码均未经过测试,待代码编写完整后再测试)
![]()
OracleMembershipProvider
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using System.Web;
5
using System.Web.Security;
6
using System.Data;
7
using System.Data.OleDb;
8
using System.Collections;
9
using System.Configuration;
10![]()
11![]()
/**//*表创建语句 (创建于:Oracle 8i)
12
CREATE TABLE "ANTUUSER"."SHAREPOINTUSERS"("PKID" VARCHAR2(50)
13
NOT NULL, "USERNAME" VARCHAR2(255) NOT NULL, "APPLICATIONNAME"
14
VARCHAR2(255) NOT NULL, "EMAIL" VARCHAR2(128) NOT NULL,
15
"COMMENT" VARCHAR2(255) NOT NULL, "PASSWORD" VARCHAR2(128) NOT
16
NULL, "PASSWORDQUESTION" VARCHAR2(255) NOT NULL,
17
"PASSWORDANSWER" VARCHAR2(255) NOT NULL, "ISAPPROVED" NUMBER(1)
18
NOT NULL, "LASTACTIVITYDATE" DATE NOT NULL, "LASTLOGINDATE" DATE
19
NOT NULL, "LASTPASSWORDCHANGEDATE" DATE NOT NULL, "CREATIONDATE"
20
DATE NOT NULL, "ISONLINE" NUMBER(1) NOT NULL, "ISLOCKEDOUT"
21
NUMBER(1) NOT NULL, "LASTLOCKEDOUTDATE" DATE NOT NULL,
22
"FAILEDPWDATTEMPTCOUNT" NUMBER(5) NOT NULL,
23
"FAILEDPWDATTEMPTWINSTART" DATE NOT NULL,
24
"FAILEDPWDANSWERATTEMPTCOUNT" NUMBER(5) NOT NULL,
25
"FAILEDPWDANSWERATTEMPTWINSTART" DATE NOT NULL)
26
*/
27
namespace BoooLee
28![]()
![]()
{
29
public class OracleMembershipProvider : MembershipProvider
30![]()
{
31
//OracleTools
32
private OracleTools OT = null;
33
34
//自定义属性
35
private string _UsersTableName;
36
//Oracle数据库连接串
37
private string _ConnectionString;
38
//是否允许事件日志
39
private bool _EnableEventLog;
40![]()
41
//MembershipProvider接口属性,用于存放config.web中的MembershipProvider配置属性。
42
//使用自定义成员资格提供程序的应用程序的名称。
43
private string _ApplicationName;
44
//指示成员资格提供程序是否配置为允许用户重置其密码。
45
private bool _EnablePasswordReset;
46
//指示成员资格提供程序是否配置为允许用户检索其密码。
47
private bool _EnablePasswordRetrieval;
48
//获取锁定成员资格用户前允许的无效密码或无效密码提示问题答案尝试次数。
49
private int _MaxInvalidPasswordAttempts;
50
//获取有效密码中必须包含的最少特殊字符数。
51
private int _MinRequireNonAlphanumericCharacters;
52
//获取密码所要求的最小长度。
53
private int _MinRequiredPasswordLength;
54
//获取在锁定成员资格用户之前允许的最大无效密码或无效密码提示问题答案尝试次数的分钟数。
55
private int _PasswordAttemptWindow;
56
//获取一个值,该值指示在成员资格数据存储区中存储密码的格式。
57
private MembershipPasswordFormat _PasswordFormat;
58
//获取用于计算密码的正则表达式。
59
private string _PasswordStrengthRegularExpression;
60
//获取一个值,该值指示成员资格提供程序是否配置为要求用户在进行密码重置和检索时回答密码提示问题。
61
private bool _RequiresQuestionAndAnswer;
62
//获取一个值,指示成员资格提供程序是否配置为要求每个用户名具有唯一的电子邮件地址。
63
private bool _RequiresUniqueEmail;
64
65![]()
/**//*
66
摘要:
67
初始化提供程序。
68
69
参数:
70
config: 名称/值对的集合,表示在配置中为该提供程序指定的、提供程序特定的属性。
71
name: 该提供程序的友好名称。
72
*/
73
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
74![]()
{
75
base.Initialize(name, config);
76
77
//读取MembershipProvider接口属性配置
78
_ApplicationName = GetConfigValue(config["ConnectionString"],System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath);
79
_EnablePasswordReset = Convert.ToBoolean(GetConfigValue(config["EnablePasswordReset"], "false"));
80
_EnablePasswordRetrieval = Convert.ToBoolean(GetConfigValue(config["EnablePasswordRetrieval"], "false"));
81
_MaxInvalidPasswordAttempts=Convert.ToInt32(GetConfigValue(config["MaxInvalidPasswordAttempts"],"5");
82
_MinRequireNonAlphanumericCharacters=Convert.ToInt32(GetConfigValue(config["MinRequiredNonAlphanumericCharacters"],"1");
83
_MinRequiredPasswordLength=Convert.ToInt32(GetConfigValue(config["MinRequiredPasswordLength"],"7");
84
_PasswordAttemptWindow=Convert.ToInt32(GetConfigValue(config["PasswordAttemptWindow"],"10");
85
_PasswordFormat=(MembershipPasswordFormat)GetConfigValue(config["PasswordFormat"],MembershipPasswordFormat.Clear);
86
_PasswordStrengthRegularExpression=GetConfigValue(config["PasswordStrengthRegularExpression"],""));
87
_RequiresQuestionAndAnswer=Convert.ToBoolean(GetConfigValue(config["RequiresQuestionAndAnswer"],"false"));
88
_RequiresUniqueEmail=Convert.ToBoolean(GetConfigValue(config["RequiresUniqueEmail"],"true"));
89
90
//读取自定义属性
91
ConnectionStringSettings ConnectionStringSetting=ConfigurationManager.ConnectionStrings[config["ConnectionString"]];
92
_ConnectionString=ConnectionStringSetting.ConnectionString;
93
_UsersTableName=GetConfigValue(config["UsersTableName"],"SHAREPOINTUSERS");
94
_EnableEventLog=Convert.ToBoolean(GetConfigValue(config["EnableEventLog"],"true"];
95
//初始化OT
96
OT = new OracleTools();
97
OT.ConnectionString = _ConnectionString;
98![]()
99
//为OT分配日志记录器
100
LogTools lt = new LogTools();
101
lt.EventLog = "Application";
102
lt.EventSource = "OracleMembershipProvider";
103
OT.LogTool = lt;
104
OT.EnableEventlog=_EnableEventLog;
105
}
106![]()
107![]()
/**//*
108
摘要:
109
使用自定义成员资格提供程序的应用程序的名称。
110
111
返回值:
112
使用自定义成员资格提供程序的应用程序的名称。
113
*/
114
public override string ApplicationName
115![]()
{
116
get
117![]()
{
118
return _ApplicationName;
119
}
120
set
121![]()
{
122
;
123
}
124
}
125![]()
126![]()
/**//*
127
摘要:
128
处理更新成员资格用户密码的请求。
129![]()
130
参数:
131
newPassword: 指定的用户的新密码。
132
oldPassword: 指定的用户的当前密码。
133
username: 为其更新密码的用户。
134![]()
135
返回值:
136
如果密码更新成功,则为 true;否则为 false。
137
*/
138
public override bool ChangePassword(string username, string oldPassword, string newPassword)
139![]()
{
140
string SqlString = "";
141![]()
142
//更改用户密码
143
if (UserExist(username,oldPassword)>0)
144![]()
{
145
SqlString = string.Format("update {0} set password={1} where username='{2}' and password='{3}'",_TableName, newPassword, username, oldPassword);
146
return OT.RunSqlNonQuery(SqlString);
147
}
148
149
return false;
150
}
151![]()
152![]()
/**//*
153
摘要:
154
处理更新成员资格用户的密码提示问题和答案的请求。
155![]()
156
参数:
157
newPasswordQuestion: 指定的用户的新密码提示问题。
158
newPasswordAnswer: 指定的用户的新密码提示问题答案。
159
username: 要为其更改密码提示问题和答案的用户。
160
password: 指定的用户的密码。
161![]()
162
返回值:
163
如果成功更新密码提示问题和答案,则为 true;否则,为 false。
164
*/
165
public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
166![]()
{
167
string SqlString = "";
168![]()
169
//更改用户密码问题和密码答案
170
if (UserExist(username,password)>0)
171![]()
{
172
SqlString = string.Format("update {0} set question={1} , answer={2} where username='{3}' and password='{4}'", _TableName,newPasswordQuestion, newPasswordAnswer, username, password);
173
return OT.RunSqlNonQuery(SqlString);
174
}
175![]()
176
return false;
177
}
178![]()
179![]()
/**//*
180
摘要:
181
将新的成员资格用户添加到数据源。
182![]()
183
参数:
184
isApproved: 是否允许验证新用户。
185
passwordAnswer: 新用户的密码提示问题答案。
186
username: 新用户的用户名。
187
providerUserKey: 成员资格数据源中该用户的唯一标识符。
188
password: 新用户的密码。
189
passwordQuestion: 新用户的密码提示问题。
190
email: 新用户的电子邮件地址。
191
status: 一个 System.Web.Security.MembershipCreateStatus 枚举值,指示是否已成功创建用户。
192![]()
193
返回值:
194
一个用新创建的用户的信息填充的 System.Web.Security.MembershipUser 对象。
195
*/
196
public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
197![]()
{
198
//TODO 实现创建用户代码
199
throw new Exception("The method or operation is not implemented.");
200
}
201![]()
202![]()
/**//*
203
摘要:
204
从成员资格数据源删除一个用户。
205![]()
206
参数:
207
username: 要删除的用户的名称。
208
deleteAllRelatedData: 如果为 true,则从数据库中删除与该用户相关的数据;如果为 false,则将与该用户相关的数据保留在数据库。
209![]()
210
返回值:
211
如果用户被成功删除,则为 true;否则为 false。
212
*/
213
public override bool DeleteUser(string username, bool deleteAllRelatedData)
214![]()
{
215
string SqlString = "";
216![]()
217
//删除用户
218
if (UserExist(username)>0)
219![]()
{
220
SqlString = string.Format("delete from {0} where username='{1}'",_TableName, username);
221
return OT.RunSqlNonQuery(SqlString);
222
}
223![]()
224
return false;
225
}
226![]()
227![]()
/**//*
228
摘要:
229
指示成员资格提供程序是否配置为允许用户重置其密码。
230![]()
231
返回值:
232
如果成员资格提供程序支持密码重置,则为 true;否则为 false。默认为 true。
233
*/
234
public override bool EnablePasswordReset
235![]()
{
236
get
237![]()
{
238
return _EnablePasswordReset;
239
}
240
}
241
242![]()
/**//*
243
摘要:
244
指示成员资格提供程序是否配置为允许用户检索其密码。
245![]()
246
返回值:
247
如果成员资格提供程序配置为支持密码检索,则为 true,否则为 false。默认为 false。
248
*/
249
public override bool EnablePasswordRetrieval
250![]()
{
251
get
252![]()
{
253
return _EnablePasswordRetrieval;
254
}
255
}
256![]()
257![]()
/**//*
258
摘要:
259
获取一个成员资格用户的集合,这些用户的电子邮件地址包含要匹配的指定电子邮件地址。
260![]()
261
参数:
262
totalRecords: 匹配用户的总数。
263
pageIndex: 要返回的结果页的索引。pageIndex 是从零开始的。
264
emailToMatch: 要搜索的电子邮件地址。
265
pageSize: 要返回的结果页的大小。
266![]()
267
返回值:
268
包含一页 pageSizeSystem.Web.Security.MembershipUser 对象的 System.Web.Security.MembershipUserCollection 集合,这些对象从 pageIndex 指定的页开始。
269
*/
270
public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
271![]()
{
272
string SqlString = "";
273
MembershipUserCollection muc = new MembershipUserCollection();
274
totalRecords = UserExistByMail(emailToMatch);
275
if (totalRecords>0)
276![]()
{
277
SqlString = string.Format("select * from {0} where email='{1}'", _TableName,emailToMatch);
278
muc = ToMembershipUserCollection(OT.RunSqlDataTable(SqlString));
279
}
280
return muc;
281
}
282![]()
283![]()
/**//*
284
摘要:
285
获取一个成员资格用户的集合,这些用户的用户名包含要匹配的指定用户名。
286![]()
287
参数:
288
totalRecords: 匹配用户的总数。
289
pageIndex: 要返回的结果页的索引。pageIndex 是从零开始的。
290
usernameToMatch: 要搜索的用户名。
291
pageSize: 要返回的结果页的大小。
292![]()
293
返回值:
294
包含一页 pageSizeSystem.Web.Security.MembershipUser 对象的 System.Web.Security.MembershipUserCollection 集合,这些对象从 pageIndex 指定的页开始。
295
*/
296
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
297![]()
{
298
string SqlString = "";
299
MembershipUserCollection muc = new MembershipUserCollection();
300
totalRecords = UserExist(usernameToMatch);
301
if (totalRecords > 0)
302![]()
{
303
SqlString = string.Format("select * from {0} where username='{1}'", _TableName,usernameToMatch);
304
muc=ToMembershipUserCollection( OT.RunSqlDataTable(SqlString));
305
}
306
return muc;
307
}
308![]()
309![]()
/**//*
310
摘要:
311
获取数据源中的所有用户的集合,并显示在数据页中。
312![]()
313
参数:
314
totalRecords: 匹配用户的总数。
315
pageIndex: 要返回的结果页的索引。pageIndex 是从零开始的。
316
pageSize: 要返回的结果页的大小。
317![]()
318
返回值:
319
包含一页 pageSizeSystem.Web.Security.MembershipUser 对象的 System.Web.Security.MembershipUserCollection 集合,这些对象从 pageIndex 指定的页开始。
320
*/
321
public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
322![]()
{
323
string SqlString = "";
324
MembershipUserCollection muc = new MembershipUserCollection();
325
totalRecords = UsersTotalRecords();
326
if (totalRecords > 0)
327![]()
{
328
SqlString =string.Format( "select * from {0}",_TableName);
329
muc = ToMembershipUserCollection(OT.RunSqlDataTable(SqlString));
330
}
331
return muc;
332
}
333![]()
334![]()
/**//*
335
摘要:
336
获取当前访问该应用程序的用户数。
337![]()
338
返回值:
339
当前访问该应用程序的用户数。
340
*/
341
public override int GetNumberOfUsersOnline()
342![]()
{
343
//TODO 获取在线人数
344
throw new Exception("The method or operation is not implemented.");
345
}
346![]()
347![]()
/**//*
348
摘要:
349
从数据源获取指定用户名所对应的密码。
350![]()
351
参数:
352
username: 为其检索密码的用户。
353
answer: 用户的密码提示问题答案。
354![]()
355
返回值:
356
指定用户名所对应的密码。
357
*/
358
public override string GetPassword(string username, string answer)
359![]()
{
360
string SqlString = "";
361
string password="";
362
if (UserExist(username) > 0)
363![]()
{
364
SqlString = string.Format("select password from {0} where username='{1}' and answer='{2}'", _TableName,username, answer);
365
password = OT.RunSqlScalar(SqlString);
366
}
367
return password;
368
}
369![]()
370![]()
/**//*
371
摘要:
372
从数据源获取用户的信息。提供一个更新用户最近一次活动的日期/时间戳的选项。
373![]()
374
参数:
375
username: 要获取其信息的用户名。
376
userIsOnline: 如果为 true,则更新用户最近一次活动的日期/时间戳;如果为 false,则返回用户信息,但不更新用户最近一次活动的日期/时间戳。
377![]()
378
返回值:
379
用数据源中指定用户的信息填充的 System.Web.Security.MembershipUser 对象。
380
*/
381
public override MembershipUser GetUser(string username, bool userIsOnline)
382![]()
{
383
string SqlString = "";
384
MembershipUser mu = null;
385![]()
386
if (UserExist(username) > 0)
387![]()
{
388
SqlString = string.Format("select * from {0} where username='{1}'", _TableName,username);
389
mu=ToMembershipUser(OT.RunSqlDataTable(SqlString).Rows[0]);
390
}
391![]()
392
return mu;
393
}
394![]()
395![]()
/**//*
396
摘要:
397
根据成员资格用户的唯一标识符从数据源获取该用户的信息。提供一个更新用户最近一次活动的日期/时间戳的选项。
398![]()
399
参数:
400
providerUserKey: 要获取其信息的成员资格用户的唯一标识符。
401
userIsOnline: 如果为 true,则更新用户最近一次活动的日期/时间戳;如果为 false,则返回用户信息,但不更新用户最近一次活动的日期/时间戳。
402![]()
403
返回值:
404
用数据源中指定用户的信息填充的 System.Web.Security.MembershipUser 对象。
405
*/
406
public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
407![]()
{
408
string SqlString = "";
409
MembershipUser mu = new MembershipUser();
410![]()
411
if (UserExist(username) > 0)
412![]()
{
413
SqlString = string.Format("select * from {0} where provideruserkey='{1}'", _TableName,providerUserKey.ToString());
414
mu = ToMembershipUser(OT.RunSqlDataTable(SqlString).Rows[0]);
415
}
416![]()
417
return mu;
418
}
419![]()
420
public override string GetUserNameByEmail(string email)
421![]()
{
422
throw new Exception("The method or operation is not implemented.");
423
}
424![]()
425
public override int MaxInvalidPasswordAttempts
426![]()
{
427
get
428![]()
{
429
return _MaxInvalidPasswordAttempts;
430
}
431
}
432![]()
433
public override int MinRequiredNonAlphanumericCharacters
434![]()
{
435
get
436![]()
{
437
return _MinRequireNonAlphanumericCharacters;
438
}
439![]()
440
}
441![]()
442
public override int MinRequiredPasswordLength
443![]()
{
444
get
445![]()
{
446
return _MinRequiredPasswordLength;
447
}
448
}
449![]()
450
public override int PasswordAttemptWindow
451![]()
{
452
get
453![]()
{
454
return _PasswordAttemptWindow;
455
}
456
}
457![]()
458
public override MembershipPasswordFormat PasswordFormat
459![]()
{
460
get
461![]()
{
462
return _PasswordFormat;
463
}
464
}
465![]()
466
public override string PasswordStrengthRegularExpression
467![]()
{
468
get
469![]()
{
470
return PasswordStrengthRegularExpression;
471
}
472
}
473![]()
474
public override bool RequiresQuestionAndAnswer
475![]()
{
476
get
477![]()
{
478
return RequiresQuestionAndAnswer;
479
}
480
}
481![]()
482
public override bool RequiresUniqueEmail
483![]()
{
484
get
485![]()
{
486
return RequiresUniqueEmail;
487
}
488
}
489![]()
490
public override string ResetPassword(string username, string answer)
491![]()
{
492
throw new Exception("The method or operation is not implemented.");
493
}
494![]()
495
public override bool UnlockUser(string userName)
496![]()
{
497
throw new Exception("The method or operation is not implemented.");
498
}
499![]()
500
public override void UpdateUser(MembershipUser user)
501![]()
{
502
throw new Exception("The method or operation is not implemented.");
503
}
504![]()
505
public override bool ValidateUser(string username, string password)
506![]()
{
507
throw new Exception("The method or operation is not implemented.");
508
}
509![]()
510![]()
非MembershipProvider成员#region 非MembershipProvider成员
511![]()
512![]()
/**//*
513
摘要:
514
判断用户是否存在
515![]()
516
参数:
517
username:用户名
518![]()
519
返回值:
520
找到用户返回true,没有找到用户false
521
*/
522
private int UserExist(string username)
523![]()
{
524
string SqlString = "";
525
string r = "";
526
int Count = 0;
527![]()
528
SqlString = string.Format("select count(*) from {0} where username='{1}'", _TableName,username);
529
r = OT.RunSqlScalar(SqlString);
530
try
531![]()
{
532
Count = int.Parse(r);
533
}
534
catch (Exception)
535![]()
{
536
Count = 0;
537
}
538![]()
539
return Count;
540
}
541![]()
542![]()
/**//*
543
摘要:
544
判断用户是否存在
545![]()
546
参数:
547
username:用户名
548
password:用户密码
549![]()
550
返回值:
551
找到用户的用户数。
552
*/
553
private int UserExist(string username, string password)
554![]()
{
555
string SqlString = "";
556
string r = "";
557
int Count = 0;
558![]()
559
SqlString = string.Format("select count(*) from {0} where username='{1}' and password='{2}'",_TableName, username,password);
560
r = OT.RunSqlScalar(SqlString);
561
try
562![]()
{
563
Count = int.Parse(r);
564
}
565
catch (Exception)
566![]()
{
567
Count = 0;
568
}
569![]()
570
return Count;
571
}
572![]()
573![]()
/**//*
574
摘要:
575
判断用户是否存在
576![]()
577
参数:
578
email:用户名
579![]()
580
返回值:
581
找到用户的用户数。
582
*/
583
private int UserExistByMail(string email)
584![]()
{
585
string SqlString = "";
586
string r = "";
587
int Count = 0;
588![]()
589
SqlString = string.Format("select count(*) from {0} where email='{1}'", _TableName,email);
590
r = OT.RunSqlScalar(SqlString);
591
try
592![]()
{
593
Count = int.Parse(r);
594
}
595
catch (Exception)
596![]()
{
597
Count = 0;
598
}
599![]()
600
return Count;
601
}
602![]()
603![]()
/**//*
604
摘要:
605
转换用户数据表为MembershipUserCollection
606![]()
607
参数:
608
userstable:用户表
609![]()
610
返回值:
611
返回包含用户数据的MembershipUserCollection。
612
*/
613
private MembershipUserCollection ToMembershipUserCollection(DataTable userstable)
614![]()
{
615
MembershipUserCollection muc = new MembershipUserCollection();
616![]()
617
foreach (DataRow dr in userstable.Rows)
618![]()
{
619
muc.Add(ToMembershipUser(dr));
620
}
621![]()
622
return muc;
623
}
624![]()
625![]()
/**//*
626
摘要:
627
获得用户总数
628![]()
629
返回值:
630
返回用户数。
631
*/
632
private int UsersTotalRecords()
633![]()
{
634
string SqlString = "";
635
string r = "";
636
int Count = 0;
637![]()
638
SqlString = string.Format("select count(*) from {0}",_TableName);
639
r = OT.RunSqlScalar(SqlString);
640
try
641![]()
{
642
Count = int.Parse(r);
643
}
644
catch (Exception)
645![]()
{
646
Count = 0;
647
}
648![]()
649
return Count;
650
}
651![]()
652![]()
/**//*
653
摘要:
654
转换用户数据表为MembershipUserCollection
655![]()
656
参数:
657
usersrecord:用户记录
658![]()
659
返回值:
660
返回包含用户数据的MembershipUser。
661
*/
662
private MembershipUser ToMembershipUser(DataRow usersrecord)
663![]()
{
664
MembershipUser mu = new MembershipUser();
665
try
666![]()
{
667
mu.UserName = usersrecord["username"];
668
mu.Email = usersrecord["email"];
669
mu.PasswordQuestion = usersrecord["question"];
670
}
671
catch (Exception)
672![]()
{
673
}
674
return mu;
675
}
676![]()
677![]()
/**//*
678
摘要:
679
获取配置文件
680![]()
681
参数:
682
ConfigValue:配置文件中的参数设置
683
DefaultValue:缺省值
684
685
返回值:
686
如果ConfigValue值有效则返回ConfigValue,否则返回DefaultValue。
687
*/
688
private string GetConfigValue(string ConfigValue, string DefaultValue)
689![]()
{
690
if (string.IsNullOrEmpty(ConfigValue))
691
return DefaultValue;
692
return ConfigValue;
693
}
694
#endregion
695
696
}
697
}
698
![]()
OracleTools
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using System.Data;
5
using System.Data.OleDb;
6![]()
7
namespace BoooLee
8![]()
![]()
{
9
class OracleTools
10![]()
{
11![]()
/**//// <summary>
12
/// 私有变量
13
/// </summary>
14
private string _ConnectionString = ""; //数据库连接串
15![]()
16![]()
/**//// <summary>
17
/// 日志记录器
18
/// </summary>
19
private LogTools _LogTools = null;
20![]()
21![]()
/**//// <summary>
22
/// 是否允许记录日志
23
/// </summary>
24
private bool _EnableEventLog = false;
25![]()
26![]()
/**//// <summary>
27
/// 是否允许记录日志
28
/// </summary>
29
public bool EnableEventlog
30![]()
{
31
get
32![]()
{
33
return _EnableEventLog;
34
}
35![]()
36
set
37![]()
{
38
_EnableEventLog = value;
39
}
40
}
41![]()
42![]()
/**//// <summary>
43
/// 日志记录器
44
/// </summary>
45
public LogTools LogTool
46![]()
{
47
get
48![]()
{
49
return _LogTools;
50
}
51![]()
52
set
53![]()
{
54
_LogTools = value;
55
}
56
}
57![]()
/**//// <summary>
58
/// 数据库连接串
59
/// </summary>
60
public string ConnectionString
61![]()
{
62
get
63![]()
{
64
return _ConnectionString;
65
}
66![]()
67
set
68![]()
{
69
_ConnectionString=value;
70
}
71
}
72![]()
73![]()
/**//// <summary>
74
/// 运行无返回值的Sql语句。
75
/// </summary>
76
/// <param name="SqlString">指定要运行的Sql语句。</param>
77
/// <param name="Conn">指定数据库连接。</param>
78
/// <returns>成功返回true,失败返回false。</returns>
79
public bool RunSqlNonQuery(string SqlString)
80![]()
{
81
OleDbConnection Conn=null;
82![]()
83
try
84![]()
{
85
using (OleDbCommand Command = new OleDbCommand())
86![]()
{
87
Command.CommandText = SqlString;
88
Conn = GetConnection();
89
Conn.Open();
90
Command.Connection = Conn;
91
Command.ExecuteNonQuery();
92
}
93
return true;
94
}
95
catch (Exception ex)
96![]()
{
97
if (_LogTools != null && _EnableEventLog)
98![]()
_LogTools.WriteToEventLog(ex, string.Format("RunSqlNonQuery(\"
{0}\")", SqlString));
99
return false;
100
}
101
finally
102![]()
{
103
//关闭数据库连接
104
if (Conn != null && Conn.State==ConnectionState.Open)
105
Conn.Close();
106
}
107
}
108![]()
109![]()
/**//// <summary>
110
/// 运行返回一个值的Select语句。
111
/// </summary>
112
/// <param name="SqlString">指定要运行的Sql语句。</param>
113
/// <param name="Conn">指定数据库连接。</param>
114
/// <returns>成功返回Select语句结果,失败返回空字符串。</returns>
115
public string RunSqlScalar(string SqlString)
116![]()
{
117
OleDbConnection Conn = null;
118![]()
119
try
120![]()
{
121
Conn = GetConnection();
122
Conn.Open();
123![]()
124
using (OleDbCommand Command = new OleDbCommand())
125![]()
{
126
Command.CommandText = SqlString;
127
Command.Connection = Conn;
128
return Command.ExecuteScalar().ToString();
129
}
130
}
131
catch (Exception ex)
132![]()
{
133
if (_LogTools != null && _EnableEventLog)
134![]()
_LogTools.WriteToEventLog(ex, string.Format("RunSqlScalar(\"
{0}\")",SqlString));
135
return "";
136
}
137
finally
138![]()
{
139
if (Conn != null && Conn.State == ConnectionState.Open)
140
Conn.Close();
141
}
142
}
143![]()
144![]()
/**//// <summary>
145
/// 运行返回DataTable的Sql语句。
146
/// </summary>
147
/// <param name="SqlString">指定要运行的Sql语句。</param>
148
/// <param name="Conn">指定数据库连接。</param>
149
/// <returns>成功返回Select语句结果DataTable。</returns>
150
public DataTable RunSqlDataTable(string SqlString)
151![]()
{
152
OleDbConnection Conn = null;
153![]()
154
try
155![]()
{
156
using (OleDbDataAdapter DataAdapter = new OleDbDataAdapter())
157![]()
{
158
Conn = GetConnection();
159
Conn.Open();
160
OleDbCommand SC = new OleDbCommand();
161
SC.CommandText = SqlString;
162
SC.Connection = Conn;
163
DataAdapter.SelectCommand = SC;
164
DataTable dt = new DataTable();
165
DataAdapter.Fill(dt);
166
return dt;
167
}
168
}
169
catch (Exception ex)
170![]()
{
171
if (_LogTools != null && _EnableEventLog)
172![]()
_LogTools.WriteToEventLog(ex, string.Format("RunSqlDataTable(\"
{0}\")", SqlString));
173
return new DataTable();
174
}
175
finally
176![]()
{
177
if (Conn != null && Conn.State == ConnectionState.Open)
178
Conn.Close();
179
}
180
}
181![]()
182![]()
/**//// <summary>
183
/// 返回一个OleDbConnection对象。
184
/// </summary>
185
/// <returns>成功返回的OleDbConnection对象,失败返回null。</returns>
186
public OleDbConnection GetConnection()
187![]()
{
188
try
189![]()
{
190
OleDbConnection result = new OleDbConnection();
191
result.ConnectionString = _ConnectionString;
192
return result;
193
}
194
catch (Exception ex)
195![]()
{
196
if (_LogTools != null && _EnableEventLog)
197
_LogTools.WriteToEventLog(ex, "GetConnection()");
198
return null;
199
}
200
}
201
}
202
}
203
![]()
LogTools
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4![]()
5
namespace BoooLee
6![]()
![]()
{
7
class LogTools
8![]()
{
9
private string _eventSource = "";
10
private string _eventLog = "";
11![]()
12![]()
13![]()
/**//// <summary>
14
/// 事件发生源
15
/// </summary>
16
public string EventSource
17![]()
{
18
get
19![]()
{
20
return _eventSource;
21
}
22![]()
23
set
24![]()
{
25
_eventSource = value;
26
}
27
}
28![]()
29![]()
/**//// <summary>
30
/// 日志名
31
/// </summary>
32
public string EventLog
33![]()
{
34
get
35![]()
{
36
return _eventLog;
37
}
38![]()
39
set
40![]()
{
41
_eventLog = value;
42
}
43
}
44![]()
45
public void WriteToEventLog(Exception e, string action)
46![]()
{
47
EventLog log = new EventLog();
48
log.Source = _eventSource;
49
log.Log = _eventLog;
50![]()
51
string message = "数据源发生异常.\n\n";
52
message += "操作: " + action + "\n\n";
53
message += "异常: " + e.ToString();
54![]()
55
log.WriteEntry(message);
56
}
57
}
58
}
59
随着编写的深入,从起初的只想学习一下MemshipProvider知识,变成了现在的要写一个实用的OracleMemshipProvider,这一切离不开关注本blog的朋友们,希望有兴趣的朋友参与进来,编写出基于其他数据库平台的MemshipProvider。比如:MySQLMemshipProvider等。
* 所有属性均可在web.config中配置
* 数据库操作异常写入日志
* 多了一个LogTools类,用于日志相关操作
* 自定义多个属性增加灵活性,比如可以用任意表名,
* 确定了表结构,并给出Oracle下的表创建语句( 使用本语句需要做简单修改,替换用户和表空间名)
(因为调试部署费时,所以代码均未经过测试,待代码编写完整后再测试)
1
using System;2
using System.Collections.Generic;3
using System.Text;4
using System.Web;5
using System.Web.Security;6
using System.Data;7
using System.Data.OleDb;8
using System.Collections;9
using System.Configuration;10

11

/**//*表创建语句 (创建于:Oracle 8i)12
CREATE TABLE "ANTUUSER"."SHAREPOINTUSERS"("PKID" VARCHAR2(50) 13
NOT NULL, "USERNAME" VARCHAR2(255) NOT NULL, "APPLICATIONNAME" 14
VARCHAR2(255) NOT NULL, "EMAIL" VARCHAR2(128) NOT NULL, 15
"COMMENT" VARCHAR2(255) NOT NULL, "PASSWORD" VARCHAR2(128) NOT 16
NULL, "PASSWORDQUESTION" VARCHAR2(255) NOT NULL, 17
"PASSWORDANSWER" VARCHAR2(255) NOT NULL, "ISAPPROVED" NUMBER(1) 18
NOT NULL, "LASTACTIVITYDATE" DATE NOT NULL, "LASTLOGINDATE" DATE 19
NOT NULL, "LASTPASSWORDCHANGEDATE" DATE NOT NULL, "CREATIONDATE" 20
DATE NOT NULL, "ISONLINE" NUMBER(1) NOT NULL, "ISLOCKEDOUT" 21
NUMBER(1) NOT NULL, "LASTLOCKEDOUTDATE" DATE NOT NULL, 22
"FAILEDPWDATTEMPTCOUNT" NUMBER(5) NOT NULL, 23
"FAILEDPWDATTEMPTWINSTART" DATE NOT NULL, 24
"FAILEDPWDANSWERATTEMPTCOUNT" NUMBER(5) NOT NULL, 25
"FAILEDPWDANSWERATTEMPTWINSTART" DATE NOT NULL) 26
*/27
namespace BoooLee28


{29
public class OracleMembershipProvider : MembershipProvider30

{31
//OracleTools32
private OracleTools OT = null;33
34
//自定义属性35
private string _UsersTableName; 36
//Oracle数据库连接串37
private string _ConnectionString;38
//是否允许事件日志39
private bool _EnableEventLog;40

41
//MembershipProvider接口属性,用于存放config.web中的MembershipProvider配置属性。42
//使用自定义成员资格提供程序的应用程序的名称。43
private string _ApplicationName;44
//指示成员资格提供程序是否配置为允许用户重置其密码。45
private bool _EnablePasswordReset;46
//指示成员资格提供程序是否配置为允许用户检索其密码。47
private bool _EnablePasswordRetrieval;48
//获取锁定成员资格用户前允许的无效密码或无效密码提示问题答案尝试次数。49
private int _MaxInvalidPasswordAttempts;50
//获取有效密码中必须包含的最少特殊字符数。51
private int _MinRequireNonAlphanumericCharacters;52
//获取密码所要求的最小长度。53
private int _MinRequiredPasswordLength;54
//获取在锁定成员资格用户之前允许的最大无效密码或无效密码提示问题答案尝试次数的分钟数。55
private int _PasswordAttemptWindow;56
//获取一个值,该值指示在成员资格数据存储区中存储密码的格式。57
private MembershipPasswordFormat _PasswordFormat;58
//获取用于计算密码的正则表达式。59
private string _PasswordStrengthRegularExpression;60
//获取一个值,该值指示成员资格提供程序是否配置为要求用户在进行密码重置和检索时回答密码提示问题。61
private bool _RequiresQuestionAndAnswer;62
//获取一个值,指示成员资格提供程序是否配置为要求每个用户名具有唯一的电子邮件地址。63
private bool _RequiresUniqueEmail;64
65

/**//*66
摘要:67
初始化提供程序。68
69
参数:70
config: 名称/值对的集合,表示在配置中为该提供程序指定的、提供程序特定的属性。71
name: 该提供程序的友好名称。72
*/73
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)74

{75
base.Initialize(name, config);76
77
//读取MembershipProvider接口属性配置78
_ApplicationName = GetConfigValue(config["ConnectionString"],System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath);79
_EnablePasswordReset = Convert.ToBoolean(GetConfigValue(config["EnablePasswordReset"], "false"));80
_EnablePasswordRetrieval = Convert.ToBoolean(GetConfigValue(config["EnablePasswordRetrieval"], "false"));81
_MaxInvalidPasswordAttempts=Convert.ToInt32(GetConfigValue(config["MaxInvalidPasswordAttempts"],"5");82
_MinRequireNonAlphanumericCharacters=Convert.ToInt32(GetConfigValue(config["MinRequiredNonAlphanumericCharacters"],"1");83
_MinRequiredPasswordLength=Convert.ToInt32(GetConfigValue(config["MinRequiredPasswordLength"],"7");84
_PasswordAttemptWindow=Convert.ToInt32(GetConfigValue(config["PasswordAttemptWindow"],"10");85
_PasswordFormat=(MembershipPasswordFormat)GetConfigValue(config["PasswordFormat"],MembershipPasswordFormat.Clear);86
_PasswordStrengthRegularExpression=GetConfigValue(config["PasswordStrengthRegularExpression"],""));87
_RequiresQuestionAndAnswer=Convert.ToBoolean(GetConfigValue(config["RequiresQuestionAndAnswer"],"false"));88
_RequiresUniqueEmail=Convert.ToBoolean(GetConfigValue(config["RequiresUniqueEmail"],"true"));89
90
//读取自定义属性91
ConnectionStringSettings ConnectionStringSetting=ConfigurationManager.ConnectionStrings[config["ConnectionString"]];92
_ConnectionString=ConnectionStringSetting.ConnectionString;93
_UsersTableName=GetConfigValue(config["UsersTableName"],"SHAREPOINTUSERS");94
_EnableEventLog=Convert.ToBoolean(GetConfigValue(config["EnableEventLog"],"true"];95
//初始化OT96
OT = new OracleTools();97
OT.ConnectionString = _ConnectionString;98

99
//为OT分配日志记录器100
LogTools lt = new LogTools();101
lt.EventLog = "Application";102
lt.EventSource = "OracleMembershipProvider";103
OT.LogTool = lt;104
OT.EnableEventlog=_EnableEventLog;105
}106

107

/**//*108
摘要:109
使用自定义成员资格提供程序的应用程序的名称。110
111
返回值:112
使用自定义成员资格提供程序的应用程序的名称。113
*/114
public override string ApplicationName115

{116
get117

{118
return _ApplicationName;119
}120
set121

{122
;123
}124
}125

126

/**//*127
摘要:128
处理更新成员资格用户密码的请求。129

130
参数:131
newPassword: 指定的用户的新密码。132
oldPassword: 指定的用户的当前密码。133
username: 为其更新密码的用户。134

135
返回值:136
如果密码更新成功,则为 true;否则为 false。137
*/138
public override bool ChangePassword(string username, string oldPassword, string newPassword)139

{140
string SqlString = "";141

142
//更改用户密码143
if (UserExist(username,oldPassword)>0)144

{145
SqlString = string.Format("update {0} set password={1} where username='{2}' and password='{3}'",_TableName, newPassword, username, oldPassword);146
return OT.RunSqlNonQuery(SqlString);147
}148
149
return false;150
}151

152

/**//*153
摘要:154
处理更新成员资格用户的密码提示问题和答案的请求。155

156
参数:157
newPasswordQuestion: 指定的用户的新密码提示问题。158
newPasswordAnswer: 指定的用户的新密码提示问题答案。159
username: 要为其更改密码提示问题和答案的用户。160
password: 指定的用户的密码。161

162
返回值:163
如果成功更新密码提示问题和答案,则为 true;否则,为 false。164
*/165
public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)166

{167
string SqlString = "";168

169
//更改用户密码问题和密码答案170
if (UserExist(username,password)>0)171

{172
SqlString = string.Format("update {0} set question={1} , answer={2} where username='{3}' and password='{4}'", _TableName,newPasswordQuestion, newPasswordAnswer, username, password);173
return OT.RunSqlNonQuery(SqlString);174
}175

176
return false;177
}178

179

/**//*180
摘要:181
将新的成员资格用户添加到数据源。182

183
参数:184
isApproved: 是否允许验证新用户。185
passwordAnswer: 新用户的密码提示问题答案。186
username: 新用户的用户名。187
providerUserKey: 成员资格数据源中该用户的唯一标识符。188
password: 新用户的密码。189
passwordQuestion: 新用户的密码提示问题。190
email: 新用户的电子邮件地址。191
status: 一个 System.Web.Security.MembershipCreateStatus 枚举值,指示是否已成功创建用户。192

193
返回值:194
一个用新创建的用户的信息填充的 System.Web.Security.MembershipUser 对象。195
*/196
public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)197

{198
//TODO 实现创建用户代码199
throw new Exception("The method or operation is not implemented.");200
}201

202

/**//*203
摘要:204
从成员资格数据源删除一个用户。205

206
参数:207
username: 要删除的用户的名称。208
deleteAllRelatedData: 如果为 true,则从数据库中删除与该用户相关的数据;如果为 false,则将与该用户相关的数据保留在数据库。209

210
返回值:211
如果用户被成功删除,则为 true;否则为 false。212
*/213
public override bool DeleteUser(string username, bool deleteAllRelatedData)214

{215
string SqlString = "";216

217
//删除用户218
if (UserExist(username)>0)219

{220
SqlString = string.Format("delete from {0} where username='{1}'",_TableName, username);221
return OT.RunSqlNonQuery(SqlString);222
}223

224
return false;225
}226

227

/**//*228
摘要:229
指示成员资格提供程序是否配置为允许用户重置其密码。230

231
返回值:232
如果成员资格提供程序支持密码重置,则为 true;否则为 false。默认为 true。233
*/234
public override bool EnablePasswordReset235

{236
get 237

{238
return _EnablePasswordReset;239
}240
}241
242

/**//*243
摘要:244
指示成员资格提供程序是否配置为允许用户检索其密码。245

246
返回值:247
如果成员资格提供程序配置为支持密码检索,则为 true,否则为 false。默认为 false。248
*/249
public override bool EnablePasswordRetrieval250

{251
get 252

{253
return _EnablePasswordRetrieval; 254
}255
}256

257

/**//*258
摘要:259
获取一个成员资格用户的集合,这些用户的电子邮件地址包含要匹配的指定电子邮件地址。260

261
参数:262
totalRecords: 匹配用户的总数。263
pageIndex: 要返回的结果页的索引。pageIndex 是从零开始的。264
emailToMatch: 要搜索的电子邮件地址。265
pageSize: 要返回的结果页的大小。266

267
返回值:268
包含一页 pageSizeSystem.Web.Security.MembershipUser 对象的 System.Web.Security.MembershipUserCollection 集合,这些对象从 pageIndex 指定的页开始。269
*/270
public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)271

{272
string SqlString = "";273
MembershipUserCollection muc = new MembershipUserCollection();274
totalRecords = UserExistByMail(emailToMatch);275
if (totalRecords>0)276

{277
SqlString = string.Format("select * from {0} where email='{1}'", _TableName,emailToMatch);278
muc = ToMembershipUserCollection(OT.RunSqlDataTable(SqlString));279
}280
return muc;281
}282

283

/**//*284
摘要:285
获取一个成员资格用户的集合,这些用户的用户名包含要匹配的指定用户名。286

287
参数:288
totalRecords: 匹配用户的总数。289
pageIndex: 要返回的结果页的索引。pageIndex 是从零开始的。290
usernameToMatch: 要搜索的用户名。291
pageSize: 要返回的结果页的大小。292

293
返回值:294
包含一页 pageSizeSystem.Web.Security.MembershipUser 对象的 System.Web.Security.MembershipUserCollection 集合,这些对象从 pageIndex 指定的页开始。295
*/296
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)297

{298
string SqlString = "";299
MembershipUserCollection muc = new MembershipUserCollection();300
totalRecords = UserExist(usernameToMatch);301
if (totalRecords > 0)302

{303
SqlString = string.Format("select * from {0} where username='{1}'", _TableName,usernameToMatch);304
muc=ToMembershipUserCollection( OT.RunSqlDataTable(SqlString));305
}306
return muc;307
}308

309

/**//*310
摘要:311
获取数据源中的所有用户的集合,并显示在数据页中。312

313
参数:314
totalRecords: 匹配用户的总数。315
pageIndex: 要返回的结果页的索引。pageIndex 是从零开始的。316
pageSize: 要返回的结果页的大小。317

318
返回值:319
包含一页 pageSizeSystem.Web.Security.MembershipUser 对象的 System.Web.Security.MembershipUserCollection 集合,这些对象从 pageIndex 指定的页开始。320
*/321
public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)322

{323
string SqlString = "";324
MembershipUserCollection muc = new MembershipUserCollection();325
totalRecords = UsersTotalRecords();326
if (totalRecords > 0)327

{328
SqlString =string.Format( "select * from {0}",_TableName);329
muc = ToMembershipUserCollection(OT.RunSqlDataTable(SqlString));330
}331
return muc;332
}333

334

/**//*335
摘要:336
获取当前访问该应用程序的用户数。337

338
返回值:339
当前访问该应用程序的用户数。340
*/341
public override int GetNumberOfUsersOnline()342

{343
//TODO 获取在线人数344
throw new Exception("The method or operation is not implemented.");345
}346

347

/**//*348
摘要:349
从数据源获取指定用户名所对应的密码。350

351
参数:352
username: 为其检索密码的用户。353
answer: 用户的密码提示问题答案。354

355
返回值:356
指定用户名所对应的密码。357
*/358
public override string GetPassword(string username, string answer)359

{360
string SqlString = "";361
string password="";362
if (UserExist(username) > 0)363

{364
SqlString = string.Format("select password from {0} where username='{1}' and answer='{2}'", _TableName,username, answer);365
password = OT.RunSqlScalar(SqlString);366
}367
return password;368
}369

370

/**//*371
摘要:372
从数据源获取用户的信息。提供一个更新用户最近一次活动的日期/时间戳的选项。373

374
参数:375
username: 要获取其信息的用户名。376
userIsOnline: 如果为 true,则更新用户最近一次活动的日期/时间戳;如果为 false,则返回用户信息,但不更新用户最近一次活动的日期/时间戳。377

378
返回值:379
用数据源中指定用户的信息填充的 System.Web.Security.MembershipUser 对象。380
*/381
public override MembershipUser GetUser(string username, bool userIsOnline)382

{383
string SqlString = "";384
MembershipUser mu = null;385

386
if (UserExist(username) > 0)387

{388
SqlString = string.Format("select * from {0} where username='{1}'", _TableName,username); 389
mu=ToMembershipUser(OT.RunSqlDataTable(SqlString).Rows[0]);390
}391

392
return mu;393
}394

395

/**//*396
摘要:397
根据成员资格用户的唯一标识符从数据源获取该用户的信息。提供一个更新用户最近一次活动的日期/时间戳的选项。398

399
参数:400
providerUserKey: 要获取其信息的成员资格用户的唯一标识符。401
userIsOnline: 如果为 true,则更新用户最近一次活动的日期/时间戳;如果为 false,则返回用户信息,但不更新用户最近一次活动的日期/时间戳。402

403
返回值:404
用数据源中指定用户的信息填充的 System.Web.Security.MembershipUser 对象。405
*/406
public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)407

{408
string SqlString = "";409
MembershipUser mu = new MembershipUser();410

411
if (UserExist(username) > 0)412

{413
SqlString = string.Format("select * from {0} where provideruserkey='{1}'", _TableName,providerUserKey.ToString());414
mu = ToMembershipUser(OT.RunSqlDataTable(SqlString).Rows[0]);415
}416

417
return mu;418
}419

420
public override string GetUserNameByEmail(string email)421

{422
throw new Exception("The method or operation is not implemented.");423
}424

425
public override int MaxInvalidPasswordAttempts426

{427
get428

{429
return _MaxInvalidPasswordAttempts;430
}431
}432

433
public override int MinRequiredNonAlphanumericCharacters434

{435
get436

{437
return _MinRequireNonAlphanumericCharacters;438
}439

440
}441

442
public override int MinRequiredPasswordLength443

{444
get445

{446
return _MinRequiredPasswordLength;447
}448
}449

450
public override int PasswordAttemptWindow451

{452
get453

{454
return _PasswordAttemptWindow;455
}456
}457

458
public override MembershipPasswordFormat PasswordFormat459

{460
get461

{462
return _PasswordFormat;463
}464
}465

466
public override string PasswordStrengthRegularExpression467

{468
get469

{470
return PasswordStrengthRegularExpression;471
}472
}473

474
public override bool RequiresQuestionAndAnswer475

{476
get477

{478
return RequiresQuestionAndAnswer;479
}480
}481

482
public override bool RequiresUniqueEmail483

{484
get485

{486
return RequiresUniqueEmail;487
}488
}489

490
public override string ResetPassword(string username, string answer)491

{492
throw new Exception("The method or operation is not implemented.");493
}494

495
public override bool UnlockUser(string userName)496

{497
throw new Exception("The method or operation is not implemented.");498
}499

500
public override void UpdateUser(MembershipUser user)501

{502
throw new Exception("The method or operation is not implemented.");503
}504

505
public override bool ValidateUser(string username, string password)506

{507
throw new Exception("The method or operation is not implemented.");508
}509

510

非MembershipProvider成员#region 非MembershipProvider成员511

512

/**//*513
摘要:514
判断用户是否存在515

516
参数:517
username:用户名 518

519
返回值:520
找到用户返回true,没有找到用户false521
*/522
private int UserExist(string username)523

{524
string SqlString = "";525
string r = "";526
int Count = 0;527

528
SqlString = string.Format("select count(*) from {0} where username='{1}'", _TableName,username);529
r = OT.RunSqlScalar(SqlString);530
try531

{532
Count = int.Parse(r);533
}534
catch (Exception)535

{536
Count = 0;537
}538

539
return Count;540
}541

542

/**//*543
摘要:544
判断用户是否存在545

546
参数:547
username:用户名548
password:用户密码549

550
返回值:551
找到用户的用户数。552
*/553
private int UserExist(string username, string password)554

{555
string SqlString = "";556
string r = "";557
int Count = 0;558

559
SqlString = string.Format("select count(*) from {0} where username='{1}' and password='{2}'",_TableName, username,password);560
r = OT.RunSqlScalar(SqlString);561
try562

{563
Count = int.Parse(r);564
}565
catch (Exception)566

{567
Count = 0;568
}569

570
return Count;571
}572

573

/**//*574
摘要:575
判断用户是否存在576

577
参数:578
email:用户名 579

580
返回值:581
找到用户的用户数。582
*/583
private int UserExistByMail(string email)584

{585
string SqlString = "";586
string r = "";587
int Count = 0;588

589
SqlString = string.Format("select count(*) from {0} where email='{1}'", _TableName,email);590
r = OT.RunSqlScalar(SqlString);591
try592

{593
Count = int.Parse(r);594
}595
catch (Exception)596

{597
Count = 0;598
}599

600
return Count;601
}602

603

/**//*604
摘要:605
转换用户数据表为MembershipUserCollection606

607
参数:608
userstable:用户表609

610
返回值:611
返回包含用户数据的MembershipUserCollection。612
*/613
private MembershipUserCollection ToMembershipUserCollection(DataTable userstable)614

{615
MembershipUserCollection muc = new MembershipUserCollection();616

617
foreach (DataRow dr in userstable.Rows)618

{619
muc.Add(ToMembershipUser(dr));620
}621

622
return muc;623
}624

625

/**//*626
摘要:627
获得用户总数628

629
返回值:630
返回用户数。631
*/632
private int UsersTotalRecords()633

{634
string SqlString = "";635
string r = "";636
int Count = 0;637

638
SqlString = string.Format("select count(*) from {0}",_TableName);639
r = OT.RunSqlScalar(SqlString);640
try641

{642
Count = int.Parse(r);643
}644
catch (Exception)645

{646
Count = 0;647
}648

649
return Count;650
}651

652

/**//*653
摘要:654
转换用户数据表为MembershipUserCollection655

656
参数:657
usersrecord:用户记录658

659
返回值:660
返回包含用户数据的MembershipUser。661
*/662
private MembershipUser ToMembershipUser(DataRow usersrecord)663

{664
MembershipUser mu = new MembershipUser();665
try666

{667
mu.UserName = usersrecord["username"];668
mu.Email = usersrecord["email"];669
mu.PasswordQuestion = usersrecord["question"];670
}671
catch (Exception)672

{673
}674
return mu;675
}676

677

/**//*678
摘要:679
获取配置文件680

681
参数:682
ConfigValue:配置文件中的参数设置683
DefaultValue:缺省值684
685
返回值:686
如果ConfigValue值有效则返回ConfigValue,否则返回DefaultValue。687
*/688
private string GetConfigValue(string ConfigValue, string DefaultValue)689

{690
if (string.IsNullOrEmpty(ConfigValue))691
return DefaultValue;692
return ConfigValue;693
}694
#endregion695
696
}697
}698

1
using System;2
using System.Collections.Generic;3
using System.Text;4
using System.Data;5
using System.Data.OleDb;6

7
namespace BoooLee8


{9
class OracleTools10

{11

/**//// <summary>12
/// 私有变量13
/// </summary>14
private string _ConnectionString = ""; //数据库连接串15

16

/**//// <summary>17
/// 日志记录器18
/// </summary>19
private LogTools _LogTools = null;20

21

/**//// <summary>22
/// 是否允许记录日志23
/// </summary>24
private bool _EnableEventLog = false;25

26

/**//// <summary>27
/// 是否允许记录日志28
/// </summary>29
public bool EnableEventlog30

{31
get32

{33
return _EnableEventLog;34
}35

36
set37

{38
_EnableEventLog = value;39
}40
}41

42

/**//// <summary>43
/// 日志记录器44
/// </summary>45
public LogTools LogTool46

{47
get48

{49
return _LogTools;50
}51

52
set53

{54
_LogTools = value;55
}56
}57

/**//// <summary>58
/// 数据库连接串59
/// </summary>60
public string ConnectionString61

{62
get63

{64
return _ConnectionString;65
}66

67
set68

{69
_ConnectionString=value;70
}71
}72

73

/**//// <summary>74
/// 运行无返回值的Sql语句。75
/// </summary>76
/// <param name="SqlString">指定要运行的Sql语句。</param>77
/// <param name="Conn">指定数据库连接。</param>78
/// <returns>成功返回true,失败返回false。</returns>79
public bool RunSqlNonQuery(string SqlString)80

{81
OleDbConnection Conn=null;82

83
try84

{85
using (OleDbCommand Command = new OleDbCommand())86

{87
Command.CommandText = SqlString;88
Conn = GetConnection();89
Conn.Open();90
Command.Connection = Conn; 91
Command.ExecuteNonQuery();92
}93
return true;94
}95
catch (Exception ex)96

{97
if (_LogTools != null && _EnableEventLog)98

_LogTools.WriteToEventLog(ex, string.Format("RunSqlNonQuery(\"
{0}\")", SqlString));99
return false;100
}101
finally 102

{103
//关闭数据库连接104
if (Conn != null && Conn.State==ConnectionState.Open)105
Conn.Close();106
}107
}108

109

/**//// <summary>110
/// 运行返回一个值的Select语句。111
/// </summary>112
/// <param name="SqlString">指定要运行的Sql语句。</param>113
/// <param name="Conn">指定数据库连接。</param>114
/// <returns>成功返回Select语句结果,失败返回空字符串。</returns>115
public string RunSqlScalar(string SqlString)116

{117
OleDbConnection Conn = null;118

119
try120

{121
Conn = GetConnection();122
Conn.Open();123

124
using (OleDbCommand Command = new OleDbCommand())125

{126
Command.CommandText = SqlString;127
Command.Connection = Conn;128
return Command.ExecuteScalar().ToString();129
}130
}131
catch (Exception ex)132

{133
if (_LogTools != null && _EnableEventLog)134

_LogTools.WriteToEventLog(ex, string.Format("RunSqlScalar(\"
{0}\")",SqlString));135
return "";136
}137
finally138

{139
if (Conn != null && Conn.State == ConnectionState.Open)140
Conn.Close();141
}142
}143

144

/**//// <summary>145
/// 运行返回DataTable的Sql语句。146
/// </summary>147
/// <param name="SqlString">指定要运行的Sql语句。</param>148
/// <param name="Conn">指定数据库连接。</param>149
/// <returns>成功返回Select语句结果DataTable。</returns>150
public DataTable RunSqlDataTable(string SqlString)151

{152
OleDbConnection Conn = null;153

154
try155

{156
using (OleDbDataAdapter DataAdapter = new OleDbDataAdapter())157

{158
Conn = GetConnection();159
Conn.Open();160
OleDbCommand SC = new OleDbCommand();161
SC.CommandText = SqlString;162
SC.Connection = Conn;163
DataAdapter.SelectCommand = SC;164
DataTable dt = new DataTable();165
DataAdapter.Fill(dt);166
return dt;167
}168
}169
catch (Exception ex)170

{171
if (_LogTools != null && _EnableEventLog)172

_LogTools.WriteToEventLog(ex, string.Format("RunSqlDataTable(\"
{0}\")", SqlString));173
return new DataTable();174
}175
finally176

{177
if (Conn != null && Conn.State == ConnectionState.Open)178
Conn.Close();179
}180
}181

182

/**//// <summary>183
/// 返回一个OleDbConnection对象。184
/// </summary>185
/// <returns>成功返回的OleDbConnection对象,失败返回null。</returns>186
public OleDbConnection GetConnection()187

{188
try189

{190
OleDbConnection result = new OleDbConnection();191
result.ConnectionString = _ConnectionString;192
return result;193
}194
catch (Exception ex)195

{196
if (_LogTools != null && _EnableEventLog)197
_LogTools.WriteToEventLog(ex, "GetConnection()");198
return null;199
}200
}201
}202
}203

1
using System;2
using System.Collections.Generic;3
using System.Text;4

5
namespace BoooLee6


{7
class LogTools8

{9
private string _eventSource = "";10
private string _eventLog = "";11

12

13

/**//// <summary>14
/// 事件发生源15
/// </summary>16
public string EventSource17

{18
get19

{20
return _eventSource;21
}22

23
set24

{25
_eventSource = value;26
}27
}28

29

/**//// <summary>30
/// 日志名31
/// </summary>32
public string EventLog33

{34
get35

{36
return _eventLog;37
}38

39
set40

{41
_eventLog = value;42
}43
}44

45
public void WriteToEventLog(Exception e, string action)46

{47
EventLog log = new EventLog();48
log.Source = _eventSource;49
log.Log = _eventLog;50

51
string message = "数据源发生异常.\n\n";52
message += "操作: " + action + "\n\n";53
message += "异常: " + e.ToString();54

55
log.WriteEntry(message);56
}57
}58
}59

随着编写的深入,从起初的只想学习一下MemshipProvider知识,变成了现在的要写一个实用的OracleMemshipProvider,这一切离不开关注本blog的朋友们,希望有兴趣的朋友参与进来,编写出基于其他数据库平台的MemshipProvider。比如:MySQLMemshipProvider等。

浙公网安备 33010602011771号