随笔 - 268  文章 - 0  评论 - 1028  阅读 - 160万

简单设计实现基于Forms认证的注册登录等用户基础服务

前一段时间博客园新闻里看到的雄文:你会做Web上的用户登录功能吗

弱弱地表示,按照文章中的标准,写了这么长时间的程序,还真的不完全会写web上的用户登录功能,或者说不能完全按照这个标准写出复杂的登录功能来。也许是被微软惯坏了,深刻反省。

好了,言归正传,下面就来重点说说本文要讨论的:实现基于Forms认证的注册和登录等用户基础服务。

众所周知,asp.net提供了“Forms”、“Windows”、“Passport”和“None”四种验证模式。在web.config文件中,经常看到类似这样的一段配置节:

    <authentication mode="Forms">
      <forms cookieless="UseCookies" defaultUrl="~/Default.aspx" loginUrl="~/Login.aspx" timeout="2880"></forms>
    </authentication>

这里的配置文件就和下面要讨论的被普遍使用的Forms认证模式有关。

要使用Forms认证,通常情况下,有了上面的配置,在你的代码中调用几个类如FormsAuthentication等等就可以实现基本的登录注册改密等功能了(如何调用MS的类库实现登录注册等功能不是本文讨论的重点)。

你可能会问MS是怎么实现用户注册登录功能的呢?这里只能简单告诉你,和MembershipProvider有关。如果你确实有心决定知道MS的登录组件是怎么工作的,不妨查看一下它的源码。一致认为微软做的太复杂了,而且不怎么符合实际的业务需求,至少我工作过的公司还没碰到过拿微软实现的那一套直接在项目中使用的。

对照着MembershipProvider的源码,自己简单整理并抽象出以下几个常用接口方法:

IUserService

面向接口编程有多重要当然不需要多做说明。

接着,有接口自然还需要有具体实现。具体的实现无非按照特定的规则进行特定的处理:

UserService


UserInfo是自定义的用户信息实体类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[Serializable]
public class UserInfo : IIdentity, IPrincipal
{
    public int UserId { get; set; }
 
    public string UserName { get; set; }
 
    public string Password { get; set; }
 
    public int UserType { get; set; }
 
    public string Email { get; set; }
 
    public DateTime CreateDate { get; set; }
 
    public DateTime UpdateDate { get; set; }
 
    public string Name { get; set; }
 
    public string AuthenticationType
    {
        get { return "Forms"; }
    }
 
    public bool IsAuthenticated { get; set; }
 
    public IIdentity Identity
    {
        get { return this; }
    }
 
    public bool IsInRole(string role)
    {
        return false;
    }
}

简单示例,没有列举其他常见属性。

DAO的实现就不贴了,无非访问库做一些CRUD的操作。

这样一个简单实用的用户服务大功告成……所以说做MS的程序员是幸福的,前提是你得熟悉原理思路清晰。

到这里你还会觉得web上的用户登录功能很难吗?不难吧?!

实际上你还可以继承MembershipProvider扩展实现自己的MembershipProvider,同时还可以实现自己的角色权限管理等常用用户相关功能,区区一个简单的登录功能自然不在话下。

当然你完全可以独树一帜,实现自定义的复杂规则下的注册登录安全认证等等功能,正如本文开篇提到的那片雄文所讲的那样。

posted on   JeffWong  阅读(913)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
< 2011年9月 >
28 29 30 31 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 1
2 3 4 5 6 7 8

I know how to make it works and I want to know how it works.
点击右上角即可分享
微信分享提示