原文:ASP.NET关于Login控件使用,LoginView 控件,CreateUserWizard 控件

Login控件它是属于Membership服务的一部分,必须配置Membership提供程序和数据库...



如果你要使用自己的数据库则必须继承MembershipProvider抽象类重写自己的提供程序并正确配置Web.config...
 
ASP.NET登陆控件比较多,封装了大部分WEB应用中要实现系统登陆的系列功能,涉及到很多方面。众多 ASP.NET
登录控件一起为 ASP.NET Web 应用程序提供可靠的无需编程的登录解决方案。默认情况下,登录控件与 ASP.NET 成员资格和
Forms 身份验证集成,以帮助使网站的用户身份验证过程自动化。默认情况下,ASP.NET 登录控件以纯文本形式工作于 HTTP
上。如果您对安全性十分关注,那么可以使用带 SSL 加密的 HTTPS。
 注意

  如果将 ASP.NET 网页的 Method 从 POST(默认值)更改为 GET,则登录控件可能无法正常工作。

=============================================

LoginView
控件

使用 LoginView
控件,可以向匿名用户和登录用户显示不同的信息。该控件显示以下两个模板之一:AnonymousTemplate 或
LoggedInTemplate。在这些模板中,您可以分别添加为匿名用户和经过身份验证的用户显示适当信息的标记和控件。

  LoginView 控件还包括 ViewChanging 和 ViewChanged
的事件,您可以为这些事件编写当用户登录和更改状态时的处理程序。

  LoginStatus 控件 LoginStatus
控件为没有通过身份验证的用户显示登录链接,为通过身份验证的用户显示注销链接。登录链接将用户带到登录页。注销链接将当前用户的身份重置为匿名用户。

  可以通过设置 LoginText 和 LoginImageUrl 属性自定义 LoginStatus 控件的外观。

  LoginName 控件 如果用户已使用 ASP.NET 成员资格登录,LoginName
控件将显示该用户的登录名。或者,如果站点使用集成 Windows 身份验证,该控件将显示用户的 Windows 帐户名。

  PasswordRecovery 控件 PasswordRecovery
控件允许根据创建帐户时所使用的电子邮件地址来找回用户密码。PasswordRecovery
控件会向用户发送包含密码的电子邮件。

  您可以配置 ASP.NET 成员资格,以使用不可逆的加密来存储密码。在这种情况下,PasswordRecovery
控件将生成一个新密码,而不是将原始密码发送给用户。

  您还可以配置成员资格,以包括一个用户为了找回密码必须回答的安全提示问题。如果这样做,PasswordRecovery
控件将在找回密码前提问该问题并核对答案。

  PasswordRecovery 控件要求您的应用程序能够将电子邮件转发给简单邮件传输协议 (SMTP)
服务器。您可以通过设置 MailDefinition 属性自定义发送给用户的电子邮件的文本和格式。

  注意

  电子邮件中的密码信息是以明文形式发送的。其 MailDefinition 属性设置用来自定义电子邮件。

  如下代码:



 < asp:PasswordRecovery ID="Passwo

  rdRecovery1" Runat="server" SubmitButtonText="Get Password" SubmitButtonType="Link">

  < MailDefinition From="administrator@Contoso.com" Subject="Your new password" BodyFileName="PasswordMail.txt" />

  < /asp:PasswordRecovery>

===================================================================

ASP.NET Login控件延伸:CreateUserWizard
控件

  CreateUserWizard 控件收集潜在用户提供的信息。默认情况下,CreateUserWizard
控件将新用户添加到 ASP.NET 成员资格系统中。

  CreateUserWizard 控件收集下列用户信息:

  用户名

  密码

  密码确认

  电子邮件地址

  安全提示问题

  安全答案

  此信息用来对用户进行身份验证并找回用户密码(如果需要的话)。

  注意

  CreateUserWizard 控件从 Wizard 控件继承。

  如下代码:

  ASP.NET Login控件延伸:ChangePassword 控件

  通过 ChangePassword
控件,用户可以更改其密码。用户必须首先提供原始密码,然后创建并确认新密码。如果原始密码正确,则用户密码将更改为新密码。该控件还支持发送关于新密码的电子邮件。

  ChangePassword 控件包含显示给用户的两个模板化视图。第一个模板是
ChangePasswordTemplate,它显示用来收集更改用户密码所需的数据的用户界面。第二个模板是
SuccessTemplate,它定义当用户密码更改成功以后显示的用户界面。

  ChangePassword
控件由通过身份验证和未通过身份验证的用户使用。如果用户未通过身份验证,该控件将提示用户输入登录名。如果用户已通过身份验证,该控件将用用户的登录名填充文本框。

========================================================================

今天上网找了一些关于Login控件的使用资料,遇到一个问题:Login控件本身具有不为空的验证,就是说当用户没有输入用户名或密码的时候,直接点提交不会通过验证,会在用户名和密码的后面出现“*”,意为必须输入的项。我想,如果我不想让它显示“*”,让显示“必须填写用户名”和“必须填写密码”的提示信息。上网找了半天,就是找不到我想要达到的效果。最后还是自己研究出来了。显示“*”是Login控件本身具备的特点,所以我选择了右键控件,选择“转换为模板”,这样Login就作为几个控件合在一起的组合体。显示“*”的是RequiredFieldValidator验证控件,将它的text属性“*”,改为你想要显示的提示就行了。

另外,如果想要用ValidationSummary和Login控件合用的话,只要将其ValidationGroup属性设置为Login控件的ID就可以了。

下面是从网上转载过来的关于Login控件的一些属性和事件:

Login控件



1.功能

Login控件是一个复合控件,它提供对网站上的用户进行身份验证所需的,所有常见的UI元素。所有登录方案都需要以下三个元素:

● 用于标识用户的惟一用户名。

● 用于验证用户标识的密码。

● 用于将登录信息发送到服务器的登录按钮。

Login 控件还提供以下支持附加功能的可选UI 元素:

● 密码提示链接。

● 用于在两次会话之间保留登录信息的“记住我”复选框。

● 为那些在登录时遇到问题的用户提供的帮助链接。

● 将用户重定向到注册页的“注册新用户”链接。

● 出现在登录窗体上的说明文本。

● 在用户未填写用户名或密码字段而直接单击登录按钮时,出现的自定义错误文本。

● 登录失败时出现的自定义错误文本。

● 登录成功时发生的自定义操作。

● 在用户已登录到站点时隐藏登录控件的方法

2.属性

Login控件部分常用属性及说明,如表1所示。

表1 Login控件最常用的属性及说明

属性                                              
描述



CreateUserIconUrl            
获取显示在新用户的注册页链接旁边的图像的位置



CreateUserText               
获取或设置新用户注册页的链接文本



CreateUserUrl                
获取或设置新用户注册页的 URL



DestinationPageUrl           
获取或设置在登录尝试成功时向用户显示的页面的 URL



FailureAction                
获取或设置当登录尝试失败时发生的操作



FailureText                  
获取或设置当登录尝试失败时显示的文本



HelpPageText                 
获取或设置登录帮助页链接的文本



HelpPageUrl                  
获取或设置登录帮助页的URL



LoginButtonText              
获取或设置Login控件的登录按钮的文本



LoginButtonType              
获取或设置在呈现Login按钮时使用的按钮类型



MembershipProvider           
获取或设置控件使用的成员资格数据提供程序的名称



Orientatio                   
获取或设置一个值,该值指定页面上Login控件的元素的位置



PasswordLabelText            
获取或设置 Password文本框的标签文本



PasswordRecoveryText         
获取或设置密码恢复页链接的文本



PasswordRecoveryUrl          
获取或设置密码恢复页的 URL



PasswordRequiredErrorMessage 获取或设置当密码字段为空时在
ValidationSummary控件中显示的错误信息



RememberMeText               
获取或设置“记住我”复选框的标签文本



TextLayout                   
指定 Login 控件的每个标签相对于其关联文本框的位置



TitleText                    
获取或设置Login控件的标题



UserName                     
获取用户输入的用户名



UserNameLabelText            
获取或设置UserName文本框的标签文本



UserNameRequiredErrorMessage 获取或设置当用户名字段为空时在ValidationSummary
控件中显示的错误信息



ValidatorTextStyle           
获取对 Style 属性集合的引用,这些属性定义与Login控件使用的验证程序关联的错误信息的外观



VisibleWhenLoggedIn          
获取或设置一个值,该值指示在验证用户身份后是否显示 Login 控件

下面对比较重要的属性进行详细介绍。

(1)CreateUserText属性

此属性获取或设置新用户注册页的链接文本。

语法:

public virtual string CreateUserText { get; set; }

属性值:

新用户注册页的链接文本。默认为 Empty。

说明:CreateUserText
属性包含站点注册页的链接文本。在CreateUserUrl属性中指定注册页的URL。如果CreateUserUrl为空,则向用户显示CreateUserText属性中的文本,但不以链接的形式显示。如果CreateUserText属性为空,则不向用户提供注册页链接

(2)CreateUserUrl属性

此属性用来设置新用户注册页的URL,它包含网站新用户注册页的URL。

语法:

public virtual string CreateUserUrl { get; set; }

属性值:

新用户注册页的 URL。默认为 Empty。

说明:CreateUserText属性包含链接使用的文本。如果CreateUserText属性为空,则不向用户提供注册页链接。

(3)DestinationPageUrl属性

此属性获取或设置在登录尝试成功时向用户显示的页面的URL。

语法:

public virtual string DestinationPageUrl { get; set; }

属性值:

登录尝试成功时用户被重定向到的页面的 URL。默认为Empty。

例如:登录成功要转向“Default2.aspx”页面。代码如下:

Login1.DestinationPageUrl = "~/Default2.aspx";

(4)FailureAction属性

此属性获取或设置当登录尝试失败时发生的操作。

语法:

public virtual LoginFailureAction FailureAction { get; set;
}

属性值:

LoginFailureAction枚举值之一。默认为Refresh。

LoginFailureAction枚举值及说明如表5所示。

表5 LoginFailureAction枚举值及说明

枚举值                                            
说明



RedirectToLoginPage          
将用户重定向到站点的配置文件(Machine.config 和 Web.config)中所定义的登录页



Refresh                      
刷新当前页,以便 Login控件可以显示错误消息

(5)HelpPageUrl属性

此属性获取或设置登录帮助页的URL。

语法:

public virtual string HelpPageUrl { get; set; }

属性值:

登录帮助页的URL。默认为Empty。

说明:HelpPageUrl
属性包含网站的登录帮助页的URL。HelpPageText属性包含用于链接的文本。如果HelpPageUrl为空,则向用户显示HelpPageText属性中的文本,但不以链接的形式显示。如果HelpPageText属性为空,则不向用户提供登录帮助页链接。

(6)HelpPageText属性

此属性获取或设置登录帮助页链接的文本

语法:

public virtual string HelpPageText { get; set; }

属性值:

登录帮助页链接的文本。默认为Empty。

(7)LoginButtonType属性

此属性获取或设置在呈现Login按钮时使用的按钮类型。

语法:

public virtual ButtonType LoginButtonType { get; set; }

属性值:

ButtonType枚举值之一。默认为Button。ButtonType枚举值及说明如表6所示。

表6 ButtonType 枚举值及说明

枚举值      
   说明



Button      
   命令按钮



Image   
显示图像的按钮



Link   
超链接样式的按钮

(8)PasswordRecoveryUrl属性

此属性获取或设置密码恢复页的URL。

语法:

public virtual string PasswordRecoveryText { get; set; }

属性值:

密码恢复页链接的文本。默认为Empty。

(9)PasswordRequiredErrorMessage属性

此属性获取或设置当用户名字段为空时在ValidationSummary控件中显示的错误信息

语法:

public virtual string PasswordRequiredErrorMessage { get; set;
}

属性值:

当密码字段为空时,在ValidationSummary控件中显示的错误信息。默认值是“密码”。

(10)RememberMeText 属性

此属性获取或设置“记住我”复选框的标签文本。

语法:

public virtual string RememberMeText { get; set; }

属性值:

“记住我”复选框的标签文本。默认为下“次记住我”。

(11)UserNameRequiredErrorMessag属性

获取或设置当用户名字段为空时,在ValidationSummary控件中显示的错误信息。

语法:

public virtual string UserNameRequiredErrorMessage { get; set;
}

属性值:

当用户名字段为空时在ValidationSummary 控件中显示的错误信息。默认为“用户名”。

(12)VisibleWhenLoggedIn属性

此属性获取或设置一个值,该值指示在验证用户身份后是否显示Login控件。

语法:

public virtual bool VisibleWhenLoggedIn { get; set; }

属性值:

如果在验证用户身份后隐藏Login控件,则为false;否则为true。默认为true。

本例使用Login控件,实现成员资格用户登录网站验证用户名和密码。示例运行,输入用户名“mr”,密码“mr.soft”登录网站。

Login 控件设计代码如下。

<asp:Login ID="Login1" runat="server"
BackColor="#F7F7DE" BorderColor="#CCCC99" BorderStyle="Solid"

           
BorderWidth="1px" DestinationPageUrl="~/Default.aspx"
Font-Names="Verdana" Font-Size="10pt">

           
<TitleTextStyle BackColor="#6B696B" Font-Bold="True"
ForeColor="#FFFFFF" />

</asp:Login>

3.事件

Login控件的常用事件及说明,如表7所示。

表7 Login控件的常用事件及说明

事件                                                       
描述



Authenticate
     
验证用户的身份后出现



LoggedIn
     
在用户登录到网站并进行身份验证后出现



LoggingIn
     
在用户未进行身份验证而提交登录信息时出现



LoginError
     
当检测到登录错误时出现

下面对比较重要的事件进行详细介绍。

(1)Authenticate事件

验证用户的身份后出现。当用户使用Login控件登录到网站时,引发Authenticate事件。自定义身份验证方案可以使用Authenticate事件对用户进行身份验证。定义身份验证方案应该将Authenticated属性设置为
true,以指示已验证用户的身份。

语法:

public event AuthenticateEventHandlerAuthenticate

说明:在用户提交登录信息后,Login控件先引发LoggingIn事件,然后引发Authenticate事件,最后引发LoggedIn事件。

本例使用Login
控件的Authenticate事件,实现自定义用户登录网站。示例运行,输入用户名“System”,密码“111”登录网站。

代码如下。

protected void Login1_Authenticate1(object sender,
AuthenticateEventArgs e)

    {

       
System.Data.SqlClient.SqlConnection con = new
System.Data.SqlClient.SqlConnection("server=ZHY\\ZHY;uid=sa;pwd=;database=aspnetdb");

con.Open();

       
string strSql = "select * from tb_01 where userid='" +
Login1.UserName.ToString() + "' and username='" + Login1.Password +
"'";

       
System.Data.SqlClient.SqlCommand com = new
System.Data.SqlClient.SqlCommand(strSql, con);

       
System.Data.SqlClient.SqlDataReader dr = com.ExecuteReader();

       
if (dr.Read())

       
{

           
e.Authenticated = true;//通过验证

       
}

       
else

       
{

           
e.Authenticated = false;

       
}

       
dr.Close();

       
con.Close();

    }

==============================================

摘要:asp.net
2.0的Membership组件提供了一组非常简单易用的接口供开发者进行用户管理,用户验证。本文将它对它的实现原理进行简单的分析,介绍如何正确的使用,以及如何对它进扩展。

一、MembershipProvider抽象类

在很多情况下,在使用Membership的时候我们并不会直接使用到这个类。在MembershipProvider类定义的都是一些抽象方法和抽象属性,就是这些方法和属性构成了Membership接口的基本规范,而且在.NET
框架内部使用Membership的功能都是通过这个类型调用的。继承类通过实现这些接口来提供不用环境下的用户管理功能,并且对Membership框架本身并没有影响,下面来看看MembershipProvider原形定义:

public abstract class MembershipProvider : ProviderBase

...{

// Events

public event MembershipValidatePasswordEventHandler
ValidatingPassword;

// Methods

protected MembershipProvider();

public abstract bool ChangePassword(string username, string
oldPassword, string newPassword);

public abstract bool ChangePasswordQuestionAndAnswer(string
username, string password, string newPasswordQuestion, string
newPasswordAnswer);

public abstract MembershipUser CreateUser(string username, string
password, string email, string passwordQuestion, string
passwordAnswer, bool isApproved, object providerUserKey, out
MembershipCreateStatus status);

protected virtual byte[] DecryptPassword(byte[]
encodedPassword);

public abstract bool DeleteUser(string username, bool
deleteAllRelatedData);

internal string EncodePassword(string pass, int passwordFormat,
string salt);

protected virtual byte[] EncryptPassword(byte[] password);

public abstract MembershipUserCollection FindUsersByEmail(string
emailToMatch, int pageIndex, int pageSize, out int
totalRecords);

public abstract MembershipUserCollection FindUsersByName(string
usernameToMatch, int pageIndex, int pageSize, out int
totalRecords);

internal string GenerateSalt();

public abstract MembershipUserCollection GetAllUsers(int pageIndex,
int pageSize, out int totalRecords);

public abstract int GetNumberOfUsersOnline();

public abstract string GetPassword(string username, string
answer);

public abstract MembershipUser GetUser(object providerUserKey, bool
userIsOnline);

public abstract MembershipUser GetUser(string username, bool
userIsOnline);

internal MembershipUser GetUser(string username, bool userIsOnline,
bool throwOnError);

public abstract string GetUserNameByEmail(string email);

protected virtual void
OnValidatingPassword(ValidatePasswordEventArgs e);

public abstract string ResetPassword(string username, string
answer);

internal string UnEncodePassword(string pass, int
passwordFormat);

public abstract bool UnlockUser(string userName);

public abstract void UpdateUser(MembershipUser user);

public abstract bool ValidateUser(string username, string
password);

// Properties

public abstract string ApplicationName ...{ get; set; }

public abstract bool EnablePasswordReset ...{ get; }

public abstract bool EnablePasswordRetrieval ...{ get; }

public abstract int MaxInvalidPasswordAttempts ...{ get; }

public abstract int MinRequiredNonAlphanumericCharacters ...{ get;
}

public abstract int MinRequiredPasswordLength ...{ get; }

public abstract int PasswordAttemptWindow ...{ get; }

public abstract MembershipPasswordFormat PasswordFormat ...{ get;
}

public abstract string PasswordStrengthRegularExpression ...{ get;
}

public abstract bool RequiresQuestionAndAnswer ...{ get; }

public abstract bool RequiresUniqueEmail ...{ get; }

// Fields

private MembershipValidatePasswordEventHandler _EventHandler;

private const int SALT_SIZE_IN_BYTES = 0x10;

}

其中修饰符为internal是几个方法是密码的辅助方法,用于加密,解密和验证密码。但这边的设计似乎有一些问题,将这些方法定义为internal范围好像有点不妥,将这些方法定义在基类中,就是为了能够被复用,但是从效果上来看,不是这样的,因为internal的成员只允许在本程序集内被使用(正常情况下,不包括反射等其它方法),这就是说我们自己扩展的MembershipProvider是无法使用到这些方法的。而且从目前应用范围来看,目前这些方法也只有在SqlMembershipProvider中被使用到,所以我认为应该将这些方法修饰符修改为protected。

二、Membership 静态类

上面提到过,一般情况下我们都不会直接去使用到MembershipProvider抽象,因为这涉及到如何去实例化真正的Membership服务类的问题,涉及到配置和实例化对象的问题一般都是比较棘手的问题,对初学者来说,想要掌握也不是那么容易。那在.NET框架中就是通过Membership(Static
Class)这个静态类来屏蔽掉这一层的复杂关系。Membership(Static
Class)除了使用者屏蔽读配置文件,初始对象等一些基本工作外,还有一个重要的作用就是重载所有的MembershipProvider所以有API,甚至为了让用户更加方便的使用,将这些方法重载为静态方法,并且提供了MembershipProvider基本API基础上更加丰富的重载实现供使用者调用。这就直接支持了不管是在UI层,还是其它的各个工程,只需要引用System.Web.Security命名空间,就可以不用关心任何细节的享受到Membership给我们提供的各种便利。下面来看看Membership(Static
Class)的原型定义:(利用Lutz Roder’s .NET Reflector可以查看它的所有实现。)

public static class Membership

...{

// Events

public static  event
MembershipValidatePasswordEventHandler ValidatingPassword;

// Methods

static Membership();

public static MembershipUser CreateUser(string username, string
password);

public static MembershipUser CreateUser(string username, string
password, string email);

public static MembershipUser CreateUser(string username, string
password, string email, string passwordQuestion, string
passwordAnswer, bool isApproved, out MembershipCreateStatus
status);

public static MembershipUser CreateUser(string username, string
password, string email, string passwordQuestion, string
passwordAnswer, bool isApproved, object providerUserKey, out
MembershipCreateStatus status);

public static bool DeleteUser(string username);

public static bool DeleteUser(string username, bool
deleteAllRelatedData);

public static MembershipUserCollection FindUsersByEmail(string
emailToMatch);

public static MembershipUserCollection FindUsersByEmail(string
emailToMatch, int pageIndex, int pageSize, out int
totalRecords);

public static MembershipUserCollection FindUsersByName(string
usernameToMatch);

public static MembershipUserCollection FindUsersByName(string
usernameToMatch, int pageIndex, int pageSize, out int
totalRecords);

public static string GeneratePassword(int length, int
numberOfNonAlphanumericCharacters);

public static MembershipUserCollection GetAllUsers();

public static MembershipUserCollection GetAllUsers(int pageIndex,
int pageSize, out int totalRecords);

private static string GetCurrentUserName();

public static int GetNumberOfUsersOnline();

public static MembershipUser GetUser();

public static MembershipUser GetUser(bool userIsOnline);

public static MembershipUser GetUser(object providerUserKey);

public static MembershipUser GetUser(string username);

public static MembershipUser GetUser(object providerUserKey, bool
userIsOnline);

public static MembershipUser GetUser(string username, bool
userIsOnline);

public static string GetUserNameByEmail(string emailToMatch);

private static void Initialize();

public static void UpdateUser(MembershipUser user);

public static bool ValidateUser(string username, string
password);

// Properties

public static string ApplicationName ...{ get; set; }

public static bool EnablePasswordReset ...{ get; }

public static bool EnablePasswordRetrieval ...{ get; }

public static string HashAlgorithmType ...{ get; }

internal static bool IsHashAlgorithmFromMembershipConfig ...{ get;
}

public static int MaxInvalidPasswordAttempts ...{ get; }

public static int MinRequiredNonAlphanumericCharacters ...{ get;
}

public static int MinRequiredPasswordLength ...{ get; }

public static int PasswordAttemptWindow ...{ get; }

public static string PasswordStrengthRegularExpression ...{ get;
}

public static MembershipProvider Provider ...{ get; }

public static MembershipProviderCollection Providers ...{ get;
}

public static bool RequiresQuestionAndAnswer ...{ get; }

public static int UserIsOnlineTimeWindow ...{ get; }

// Fields

private static char[] punctuations;

private static bool s_HashAlgorithmFromConfig;

private static string s_HashAlgorithmType;

private static bool s_Initialized;

private static Exception s_InitializeException;

private static object s_lock;

private static MembershipProvider s_Provider;

private static MembershipProviderCollection s_Providers;

private static int s_UserIsOnlineTimeWindow;

}

说到这里,就不得不多罗嗦两句。在看Membership(Static
Class)实现代码的过程中,可以发现,每一个Membersip
API重载都最后都是调用属性Provider的方法,这个属性的类型就是MembershipProvider类型,只有看到这里,你也许才会理解MembershipProvider的重要作用了吧。还有一个Providers属性,这个属性就是获得web.config中配置的所有的Membership提供服务类。它们都是静态属性,但是它们怎么去实例化的呢?就是通过调用Membership.
Initialize()这个方法,在每次调用这两个属性的时候,都会调用这个方法去判断是否已初始化了Membership提供服务类了,如果没有则去调用配置服务类,读取配置内容,从而进行初始化。到此你可能也就不难理解了,为什么我们使用那么简单了!

三、SqlMembershipProvider介绍和使用配置

OK,通过上面的介绍应该基本可以了解Membership的整体结构了吧?(如何还没有,可能是你没有打开Lutz Roder’s
.NET
Reflector去分析它的实现代码,或者是对抽象类的作用还没弄明白)。不管怎么样,我们最终的目的就是要学会如何去使用。

在这之前,我先要介绍一下,在.NET
框架中提供的两个MembershipProvider实现类:ActiveDirectoryMembershipProvider和SqlMembershipProvider(如何知道这两个类的?在MembershipProvider的Derived
Types就可以看到所有的继承类了。)前者是提供基本活动目录下的用户管理(我也没有实践过),后者就是我们最经常使用到的基于SqlServer的用户管理实现。

到了介绍如何使用了,其实园子里已经有了这方面的文章((翻译)怎么在ASP.NET
2.0中使用Membership),我也不多费口舌了。但这边要告诉大家一个最直接的学习和参考使用的办法。在系统盘找到并打开machine.config,找到AspNetSqlMembershipProvider节点,看到没有,其实这个就是一个最基本的Membership配置了,只不过是还少了一个defaultProvider属性的指定,指定了这个属性后,你再使用Login控件,进行用户登录验证就无需使用任何代码了。不信你可以试试。(关于Forms验证,就不在这里多做介绍,可以参考相关资料。关于SqlMembershipProvider的更多属性的介绍可以参看MSDN)。

四、如何自定义MembershipProvider,现有其它的MembershipProvider资源

那么,我们如何去自定义一个MembershipProvider呢?其实如果你已经了解了Membership的结构后我相信对你来说已经不是一件很难的事了,但是考虑到要完整的写一个MembershipProvider还是有一定的工作量和难度的。对于我们来说,更多的地方可能是对现有的Provider进行扩展,如SqlMembershipProvider。那其实这是非常简单的,我们只需要继承自SqlMembershipProvider,(悄悄告诉你,在Initialize方法config参数中保存的就是Provider对应配置节的属性名和值)然后扩展和重写所需的方法就可以了。使用的时候,在Provider配置节中,将type的值改为你的类名就OK了。

ASP.NET关于Login控件使用,LoginView 控件,CreateUserWizard 控件的更多相关文章

  1. 『Asp.Net 组件』Asp.Net 服务器组件 内嵌JS:让自己的控件动起来

    代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...

  2. ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性

    原文:ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性 深入讲解控件的属性持久化(一) 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开 ...

  3. c#控件攻略宝典之ListBox控件

    ListBox控件的使用: 1)控件属性 Items SelectedItems SelectioModes 2)数据绑定 DataSoure DisplayMember ValueMenber 3) ...

  4. Atitit. BigConfirmTips 控件 大数据量提示确认控件的原理and总结O9

    Atitit. BigConfirmTips 控件 大数据量提示确认控件的原理and总结O9 1. 主要的涉及的技术 1 2. 主要的流程 1 3. 调用法new confirmO9t(); 1 4. ...

  5. [转载]ExtJs4 笔记(8) Ext.slider 滚轴控件、 Ext.ProgressBar 进度条控件、 Ext.Editor 编辑控件

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...

  6. Android控件之CheckBox(复选框控件)

    一.有两种状态: 选中状态(true).未选中状态(false) 二.属性 android:id = "@+id/checkbox" android:layout_width=&q ...

  7. Jquery 操作Html 控件 CheckBox、Radio、Select 控件 【转】http://www.cnblogs.com/lxblog/archive/2013/01/09/2853056.html

    Jquery 操作Html 控件 CheckBox.Radio.Select 控件   在使用 Javascript 编写前台脚本的时候,经常会操作 Html 控件,比如 checkbox.radio ...

  8. web页面动态加载UserControl,并调用用户控件中的方法来初始化控件

    1,HTML页 头部注册: <%@ Register Src="~/WorkLog/WorkLogNewV1/UserControl/CeShiBu.ascx" TagPre ...

  9. WPF 中动态创建、删除控件,注册控件名字,根据名字查找控件

    动态创建控件 1.容器控件.RegisterName("Name",要注册的控件)   //注册控件 2.容器控件.FindName("Name") as  控 ...

随机推荐

  1. 非常棒的Visual Studo调试插件:OzCode

    非常棒的Visual Studo调试插件:OzCode 周银辉 视频介绍 http://channel9.msdn.com/Shows/Visual-Studio-Toolbox/OzCode 官方网 ...

  2. 联系人按照A~~~Z排列

    // 01 创建可变字典,存储每一个key对应的数据列表 NSMutableDictionary *nationWithCodeDicList = [NSMutableDictionary dicti ...

  3. C#函数式编程之可选值

    在我们的实际开发中已经会遇到可空类型,而在C#中自从2.0之后就提供了可空类型(Nullable<T>),普通的值类型是不可以赋值为NULL,但是在类型的后面加上问号就变成了可空类型,这样 ...

  4. js 模板引擎 为什么选择 dot

    我的上篇博文详细介绍了jquery tmpl,因为我想在我的项目里引入JS模版,所以就研究了一下,有人告诉我这个引擎的速度很慢,于是我又去搜集了一下资料,结果发现jquery tmpl是最慢的,于是乎 ...

  5. [20150925]Linux之文件系统与SHELL

    Linux之文件系统与SHELL 文件系统介绍 ext2/ext3/ext4 Ext2是GNU/Linux系统中标准的文件系统.这是Linux中使用最多的一种文件系统,它是专门为Linux设计的,拥有 ...

  6. 未能加载文件或程序集“SQLDAL”或它的某一个依赖项。系统找不到指定的文件

    1. 检查是否SQLDAL.DLL这个程序集文件是否存在,是否在Debug目录下(如果你是在Debug模式下调试).或者看看是否是配置文件中的名称和实际的dll的名称不对应. 2. 你使用的是Asse ...

  7. C++ 重载new和delete操作符

    原因: C++标准库提供的new和delete操作符,是一个通用实现,未针对具体对象做具体分析 存在分配器速度慢.小型对象空间浪费严重等问题,不适用于对效率和内存有限制的应用场景   好处: 灵活的内 ...

  8. CTE-递归[2]

    在此之前写过一个CTE的递归,取出了所有的子节点,基本上可以满足大多数的需求,这里我们来延伸一下:首先我们回顾下原来的场景 图片的上半部分递归查出某个节点的所有子节点,这个我们已经通过CTE实现了,可 ...

  9. itext poi 学习之旅 (2)创建excel

    Computer.java package com.qiang.poi; public class Computer { private int id; private String name; pr ...

  10. 多层次的Json字符串转化为对象

    using Arvato.CRM.DataTrans.ConsoleHost.Model;using System;using System.Collections.Generic;using Sys ...