代码改变世界

Winform中使用Membership 和AspNet_regsql.exe 身份验证

2014-11-28 14:31  haoyujie  阅读(194)  评论(0)    收藏  举报

写在前面

正在编写一个Winfom程序。打算使用现成的微软的解决方案。

中间遇到不少问题。

根据Membership winform 认证,等关键字找到一些文章。

不得不说,还是中国人聪明,写的文章相对实用得多。

在WinForm中使用Membership身份验证

http://www.cnblogs.com/Kiee/archive/2009/09/02/1558841.html

对我帮助比较大。

还有overstack上一些文章。

另外,自己手头有本书:《Asp.net 3.5 sp1 高级编程》的第12章,内容还是比较详实。

代码

不多说了,把代码贴上,然后说说我遇到的一些困难,希望能帮读者少走一些弯路:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>
  <connectionStrings>


    <add name="ConnectionStringName"     providerName="System.Data.SqlClient"
        connectionString="Data Source=127.0.0.1;Initial Catalog=MyLoginDb;Integrated Security=True"/>

  </connectionStrings>
  <system.web>




    <membership defaultProvider="SqlProvider">
      <providers>
        <clear />
        <add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider" 
             connectionStringName="ConnectionStringName"
           applicationName="Myapp"
           enablePasswordRetrieval="false"
           enablePasswordReset="false"
           requiresQuestionAndAnswer="false"
           requiresUniqueEmail="false"
           passwordFormat="Hashed" />
      </providers>
    </membership>


    <roleManager defaultProvider="SqlProvider"
   enabled="true"
   cacheRolesInCookie="false"
   cookieName="MyRole"
   cookieTimeout="30"
   cookiePath="/"
   cookieRequireSSL="false"
   cookieSlidingExpiration="true"
   cookieProtection="All">
      <providers>
        <add
          name="SqlProvider"
          type="System.Web.Security.SqlRoleProvider"
          connectionStringName="ConnectionStringName"
          applicationName="MyApp" />
      </providers>
    </roleManager>
    
    
  </system.web>
</configuration>

上面是app.config

步骤是这样:

1. 建一个c# console工程。

2. add new item 中,选 app config

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


using System.Security.Principal;
using System.Web;
using System.Web.Security;


namespace MembershipWinform
{
    class Program
    {
        static void Main(string[] args)
        {
            MembershipCreateStatus result;

            Membership.CreateUser("testuser", "abc.1234", "test@test.com", "Hood", "Pine Hills", true, out result);
            Console.WriteLine(result.ToString());

            Roles.CreateRole("Developer");
            Roles.AddUserToRole("testuser", "Developer");

            if (Roles.IsUserInRole("testuser", "developer"))
                Console.WriteLine("Is a developer");
            else
                Console.WriteLine("Doesn't write code.");

            if (Membership.ValidateUser("testuser", "abc.1234"))
                Console.WriteLine("User Validated.");
            else
                Console.WriteLine("User Invalid");

            Console.ReadKey();
        }
    }
}


中间遇到的一些困难

总得来说,并不顺利。

因为之前一直在做别的工作,突然转过来,一开始真发蒙。

后来逐渐找到一些感觉。

这里总结一下:

1. biying搜索的关键字,需要想清楚:Membership winform ,这两个单词最好。可以加上C#,codeplex,overstack等。

2. aspnet_regsql.exe工具,还是使用图形化的吧。因为不用太用脑。如果用命令行:aspnet_regsql.exe -A all -E

如果需要指定数据库的名字(这个是一定需要的),加-s 参数。

所以,还不如使用图形化工具,什么都看得清。

[ASPNET2.0]Membership类+SQLServer2005,AspNet_regsql.exe的使用

3. 默认的连接字符串,是指向Sql express的。

<add name="MySqlConnection"
         connectionString="Server=localhost; Database=aspnetdb; Integrated Security=True"
         providerName="System.Data.SqlClient" />

4. 默认的密码规则,要求长度>7,所以,最开始找到的例子,他里面的密码是Pass!这样的单词,是通过不了的。

 Membership.CreateUser("testuser", "Pass!", "test@test.com", "Hood", "Pine Hills", true, out result);

这句话,会传回InvalidPassword.

一开始我一直没搞清楚是怎么回事。

5. 关于角色

Roles.CreateRole("Developer");

这句话,耽误了最长的时间。

一开始,我只写的 <roleManager   enabled="true"/>

怎么也不对。一到这句话,就说连不上数据库。

我还以为是连接串有问题。

后来才明白,Role与Membership一样,都需要单独设置。

也需要指定connection string!

其它资源

有一些信息,还没来得及看
http://www.codeproject.com/Articles/55174/Custom-Fluent-Nhibernate-Membership-and-Role-Provi