asp.net2.0中Membership的扩展

2024-03-24 20:08
文章标签 扩展 asp net2.0 membership

本文主要是介绍asp.net2.0中Membership的扩展,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天看了一下 苏鹏 老师的Membership扩展的webcast做的小例子。

如果使用vs2005提供的membership进行用户注册时,里面就那么几个字段,但是如果我们想着增加qqmsn字段,怎么办?有两种方法

1.利用profileprofile可以支持强类型和基本的数据类型;

2.aspnetdb数据库中新建一张aspnet_userinfo表与aspnet_user通过username进行关联(按视频上来的,还没有测试)

一、利用profile

1.配置web.config

首先,要配置数据库链接字符串(sql2000

<connectionStrings>

    <add name="DYJ" connectionString="Data Source=.;Initial Catalog=aspnetdb;Persist Security Info=True;user id=sa;password=123" providerName="System.Data.SqlClient"/>

  </connectionStrings>

其次,membershipprofile

   <profile enabled="true" defaultProvider="profileProvider"  >

      <providers>

         <add name="profileProvider" type="System.Web.Profile.SqlProfileProvider"

 connectionStringName="DYJ"  />

      </providers>

      <properties >

        <add name="MSN" type="String"/>

        <add name="QQ" type="String"/>

      </properties>

    </profile>

    <membership>

      <providers>

        <remove name="AspNetSqlMembershipProvider" />

        <add connectionStringName="DYJ" enablePasswordRetrieval="false"

          enablePasswordReset="true" requiresQuestionAndAnswer="true"

          applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed"

          maxInvalidPasswordAttempts="3" minRequiredPasswordLength="5"

          minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"

          passwordStrengthRegularExpression="" name="AspNetSqlMembershipProvider"

          type="System.Web.Security.SqlMembershipProvider, System.Web, Version= 2.0.0 .0, Culture=neutral, PublicKeyToken=b 03f 5f 7f 11d 50a 3a " />

      </providers>

    </membership>

    <roleManager enabled="true" />

这是web.config的工作就完了,如果你没有配置aspnet_regsql则默认存放在sql2005 express数据库中,即你的网站的app_data下面的数据库文件中,如果你想修改可以使用aspnet_regsql工具进行配置。

2.开始编写代码(主要是cs文件,aspx界面代码主要是几个文本框和按钮)

protected void Button1_Click(object sender, EventArgs e)

    {

        MembershipCreateStatus ms;

        MembershipUser newuser = Membership.CreateUser(Uname.Text, Upwd.Text, MSN.Text, SQ.Text, Ans.Text, true, out ms);

        if (ms == MembershipCreateStatus.Success)

        {

            ProfileCommon p = (ProfileCommon)ProfileCommon.Create(newuser.UserName, true);

            p.QQ = QQ.Text.Trim();

            p.MSN = MSN.Text.Trim();

            p.Save();

            msg.Text = "OK";

            Server.Transfer("default.aspx");

        }

        else

        {

            string errorcode;

            switch (ms)

            {

                case MembershipCreateStatus.DuplicateUserName:

                    msg.Text = "Username already exists.";

                    break;

            }

        }

    }

3.查看profile的信息

  public DataTable listalluser()//可以绑定到GridView

    {

        DataTable dt = new DataTable();

        dt.Columns.Add("username", System.Type.GetType("System.String"));

        dt.Columns.Add("QQ", System.Type.GetType("System.String"));

        dt.Columns.Add("msn", System.Type.GetType("System.String"));

        MembershipUserCollection members = Membership.GetAllUsers();

        foreach (MembershipUser member in members)

        {

            DataRow dr = dt.NewRow();

            MembershipUser mu = Membership.GetUser(member.UserName);

            ProfileCommon p = Profile.GetProfile(member.UserName);

            dr[0] = mu.UserName;

            dr[1] = p.QQ;

            dr[2] = p.MSN;

            dt.Rows.Add(dr);

            dt.AcceptChanges();

        }

        return dt;

}

下面两步实现的功能与23是一样的,只是实现的方式不一样。下面是利用vs2005提供的CreateUserWizard控件来实现,唯一值得注意的是,要将控件转化成模板,操作方法:点击右上角的智能箭头,选择“自定义创建用户步骤”,这样就可以加入文本框之类的控件进行操作。哈哈,简单吧,要不说现在的程序员不值钱了呢,工具软件越来越智能,越来越简单了啊,全都成傻瓜型的了!

4.加入Profile属性信息,注意事件,直接双击CreateUserWizard控件即可

    protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)

    {

        //TextBox qq = (TextBox)(this.CreateUserWizard1.FindControl("QQ"));

//虽然新加的文本框在ContentTemplate中而且看aspx代码与其他的控件也没有什么区别,但是通过上面的方法不能获取到TextBox的值,总是返回null,查了N久资料才找到下面的方法

        TextBox qq =(TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("QQ");

        TextBox msn = (TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("MSN");

        ProfileCommon p =

       (ProfileCommon)ProfileCommon.Create(CreateUserWizard1.UserName, true);

        p.QQ= qq.Text;

        p.MSN = msn.Text;

        p.Save();

}

5.通过UserName来获取Profile的属性,由于Profileaspnet_user表中的user_id绑定的,因此可以通过username来获取profile信息

    protected void Button1_Click(object sender, EventArgs e)

    {

        //通过用户名来获取存储在profile表中的profile属性值

        MembershipUser user = Membership.GetUser("teng_s2008");

        ProfileCommon common = Profile.GetProfile("teng_s2008");

        TextBox1.Text = common.MSN;

        TextBox2.Text = common.QQ;

    }

如果安照上面的步骤进行配置后,在数据库aspnetdb下面的表

aspnet_applications      aspnet_users  aspnet_profile   aspnet_Membership   中可以看到你刚才增加的记录。

aspnet_applications: 存储当前系统名称,一般为你解决方案的名称。

Aspnet_user: 存储注册的用户的一些信息,例如用户ID,名称。(其它自己看吧)

Aspnet_profile: 存储注册用户的一些个性化参数,ok,我们可以看到我们定义的Department, Project均出现在这个表中,他们被存储在一个字段,一行数据中,以一些分隔符区分。

Aspnet_membership: 存储注册用户的一些细节信息,类似密码等。

但是我作的时候配置了aspnet_regsqluser信息都可以在数据库中看到,但是profile不能看到而且app_data下面增加了那个看着就不爽的数据库文件,后来查了查MSDN,找到aspnet_regsql后面参数的含义,重新执行了一下,OK了。(由于具体操作不是太清楚,错了也别怪我啊!!)

aspnet_regsql -S (local) -U sa -P 123 -d aspnetdb -A p

S:服务器;U:用户名;P:密码;d:数据库;-Aaddpprofile

注意大小写

哈哈,现在已经OK了,另一种方法还没有测试,下班了回家了!数据库中已经有记录了新建一个aspnet_userinfo,但是由于表中有数据不能建立外键关联,以后有时间在接着写了!!

由于写的不正确的地方,欢迎告诉我啊!谢谢

MSN(E-mail):teng_s2000@126.com

QQ:37210956

 

 

在网上还看到一个获取aspnet_profile表信息的方法,主要是截取字符串。数据格式有规律的啊,废话没规律微软自己也去不出来了

字母:代表类型,
            
S = String 
            B = Binary
 

数字1:代表开始字节位置

数字2:代表值的长度

 

以下是代码,没时间也没测试,来源http://dnnblog.venexus.com/Getting+The+Users+PostalCode+From+ASPNETProfile.aspx

CREATE FUNCTION dbo.fn_GetElement
(
@ord AS INT,
@str AS VARCHAR(8000),
@delim AS VARCHAR(1) )
RETURNS INT
AS
BEGIN
  -- If input is invalid, return null.
  IF  @str IS NULL
      OR LEN(@str) = 0
      OR @ord IS NULL
      OR @ord < 1
      -- @ord > [is the] expression that calculates the number of elements.
      OR @ord > LEN(@str) - LEN(REPLACE(@str, @delim, '')) + 1
    RETURN NULL
  DECLARE @pos AS INT, @curord AS INT
  SELECT @pos = 1, @curord = 1
  -- Find next element's start position and increment index.
  WHILE @curord < @ord
    SELECT
      @pos    = CHARINDEX(@delim, @str, @pos) + 1,
      @curord = @curord + 1
  RETURN    CAST(SUBSTRING(@str, @pos, CHARINDEX(@delim, @str + @delim, @pos) - @pos) AS INT)
END

go

CREATE FUNCTION dbo.fn_GetProfileElement
(
@fieldName AS NVARCHAR(100),
@fields AS NVARCHAR(4000),
@values AS NVARCHAR(4000))
RETURNS NVARCHAR(4000)
AS
BEGIN

  -- If input is invalid, return null.
  IF  @fieldName IS NULL
      OR LEN(@fieldName) = 0
      OR @fields IS NULL
      OR LEN(@fields) = 0
      OR @values IS NULL
      OR LEN(@values) = 0
    RETURN NULL

-- locate FieldName in Fields
DECLARE @fieldNameToken AS NVARCHAR(20)
DECLARE @fieldNameStart AS INTEGER, @valueStart AS INTEGER, @valueLength AS INTEGER

-- Only handle string type fields (:S:)
SET @fieldNameStart = CHARINDEX(@fieldName + ':S',@Fields,0)

-- If field is not found, return null
IF @fieldNameStart = 0 RETURN NULL
SET @fieldNameStart = @fieldNameStart + LEN(@fieldName) + 3

-- Get the field token which I've defined as the start of the field offset to the end of the length
SET @fieldNameToken = SUBSTRING(@Fields,@fieldNameStart,LEN(@Fields)-@fieldNameStart)

-- Get the values for the offset and length
SET @valueStart = dbo.fn_getelement(1,@fieldNameToken,':')
SET @valueLength = dbo.fn_getelement(2,@fieldNameToken,':')

-- Check for sane values, 0 length means the profile item was stored, just no data
IF @valueLength = 0 RETURN ''

-- Return the string
RETURN SUBSTRING(@values, @valueStart+1, @valueLength)
END

 

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE GetPostalCodeFromUserName
 @UserName nvarchar(50)
AS
BEGIN
 SET NOCOUNT ON;
 SELECT dbo.fn_GetProfileElement(N'PostalCode', dbo.aspnet_Profile.PropertyNames, dbo.aspnet_Profile.PropertyValuesString) AS PostalCode FROM dbo.aspnet_Profile INNER JOIN dbo.aspnet_Users ON dbo.aspnet_Profile.UserId = dbo.aspnet_Users.UserId where dbo.aspnet_Users.UserName = @UserName

END
GO

这篇关于asp.net2.0中Membership的扩展的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/842642

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

PHP7扩展开发之数组处理

前言 这次,我们将演示如何在PHP扩展中如何对数组进行处理。要实现的PHP代码如下: <?phpfunction array_concat ($arr, $prefix) {foreach($arr as $key => $val) {if (isset($prefix[$key]) && is_string($val) && is_string($prefix[$key])) {$arr[

PHP7扩展开发之字符串处理

前言 这次,我们来看看字符串在PHP扩展里面如何处理。 示例代码如下: <?phpfunction str_concat($prefix, $string) {$len = strlen($prefix);$substr = substr($string, 0, $len);if ($substr != $prefix) {return $prefix." ".$string;} else

PHP7扩展开发之类型处理

前言 这次,我们将演示如何在PHP扩展中如何对类型进行一些操作。如,判断变量类型。要实现的PHP代码如下: <?phpfunction get_size ($value) {if (is_string($value)) {return "string size is ". strlen($value);} else if (is_array($value)) {return "array si

PHP7扩展开发之依赖其他扩展

前言 有的时候,我们的扩展要依赖其他扩展。比如,我们PHP的mysqli扩展就依赖mysqlnd扩展。这中情况下,我们怎么使用其他扩展呢?这个就是本文讲述的内容。 我们新建立一个扩展,名字叫 demo_dep , 依赖之前的say扩展。 在demo_dep扩展中,我们实现demo_say方法。这个方法调用say扩展的say方法。 代码 基础代码 确保say扩展的头文件正确安装到了php

PHP7扩展开发之函数方式使用lib库

前言 首先说下什么是lib库。lib库就是一个提供特定功能的一个文件。可以把它看成是PHP的一个文件,这个文件提供一些函数方法。只是这个lib库是用c或者c++写的。 使用lib库的场景。一些软件已经提供了lib库,我们就没必要再重复实现一次。如,原先的mysql扩展,就是使用mysql官方的lib库进行的封装。 在本文,我们将建立一个简单的lib库,并在扩展中进行封装调用。 代码 基础

PHP7扩展开发之对象方式使用lib库

前言 上一篇文章,我们使用的是函数方式调用lib库。这篇文章我们将使用对象的方式调用lib库。调用代码如下: <?php $hello = new hello(); $result = $hello->get(); var_dump($result); ?> 我们将在扩展中实现hello类。hello类中将依赖lib库。 代码 基础代码 这个扩展,我们将在say扩展上增加相关代码。sa

PHP7扩展开发之流操作

前言 啥是流操作?简单来讲就是对一些文件,网络的IO操作。PHP已经把这些IO操作,封装成流操作。这节,我们将使用PHP扩展实现一个目录遍历的功能。PHP示例代码如下: <?phpfunction list_dir($dir) {if (is_dir($dir) === false) {return;} $dh = opendir($dir);if ($dh == false) {ret