今天看了codeproject上面的一片文章,感觉不错。作者主要是用form authentication 实现了基于角色的认证。功能还算可以,基本可以代替MS 的Membership了,但是没有membership那么庞大。做一个基本的应用是够用了。
翻译一下大概内容,大意记录如下:
作者实现了4个网页,功能是:添加用户,给用户指定角色,删除角色,管理角色。
The Classes Overview
There are 4 classes: User
, Role
, SitePrincipal
and SiteIdentity
. I would like to overview the classes' methods and properties here:
The User class
User() |
Default parameter less constructor to create a new user |
User(int userID) |
This constructor gets a userID and looks up the user details from the database |
User(string email) |
This constructor gets an email and looks up the user details from the database |
GetUsers() |
This method returns a DataSet of all the users available in the database |
GetRoles() |
This method returns a DataSet of roles assigned to the current user |
GetUserRoles(int userID) |
This static method grabs the userID and returns a roles ArrayList assigned to that user |
AddToRole(int roleID) |
This method assigns a role to the current user |
RemoveFromRole(int roleID) |
This method removes current user from the role that has been passed by the roleID . |
Add() |
Adds a new user to the database |
Update() |
Updates current user information |
Delete() |
Deletes current user |
UserID |
Gets/Sets user's id number |
FullName |
Gets/Sets user's full name |
Email |
Gets/Sets user's email |
Password |
Gets/Sets user's password |
Biography |
Gets/Sets user's biography |
DateAdded |
Gets/Sets user's registering date |
The Role class
Role() |
Default parameter less constructor to create a new role |
Role(int roleID) |
This constructor gets a roleID and looks up the role details from the database |
GetRoles() |
This method returns a DataSet of all roles available in the database |
Add() |
Adds a new role to the database |
Update() |
Updates current role information |
Delete() |
Deletes current role |
RoleID |
Gets/Sets role ID number |
RoleName |
Gets/Sets role name |
The SitePrincipal class (implements the IIPrincipal Interface)
SitePrincipal(int userID) |
This constructor gets a userID and looks up details from the database |
SitePrincipal(string email) |
This constructor gets an email and looks up details from the database |
IsInRole() |
(IIPrincipal.IsInRole() ) Indicates whether a current principal is in a specific role |
ValidateLogin() |
Adds a new user to the database |
Identity |
(IIPrincipal.Identity ) Gets/Sets the identity of the current principal |
Roles |
Gets the roles of the current principal |
The SiteIdentity class (implements the IIdentity Interface)
SiteIdentity(int userID) |
This constructor gets a userID and looks up the user details from the database |
SiteIdentity(string email) |
This constructor gets an email and looks up the user details from the database |
AuthenticationType |
(IIdentity.AuthenticationType ) Always returns "Custom Authentication " |
IsAuthenticated |
(IIdentity.IsAuthenticated ) Always returns true |
Name |
(IIdentity.Name ) Gets the name of the current user |
Email |
Gets the email of the current user |
Password |
Gets the password of the current user |
UserID |
Gets the user ID number of the current user |
Enabling Forms Authentication
为了实现ASP.NET Forms 认证, web.config 文件配置如下:
<configuration>
<system.web>
<authentication mode="Forms">
<forms name="RolesBasedAthentication"
path="/"
loginUrl="/Login.aspx"
protection="All"
timeout="30">
</forms>
</authentication>
</system.web>
</configuration>
forms的name属性指定了浏览器的cookie名字,默认的名字是.aspxauth,但是当在相同的服务器中有好几个应用程序,就应当一个不同的名字。loginurl是登录页面。timeout指定了cookie的有效时间,单位是分钟。当然了,对于要保存的cookie就无效了。protection是cookie的保存方法:all意味着数据会被加密和验证。别的可以指定的值包括:none,encryption,validation.
表单认证一旦被指定,每次用户请求一个页面,表单就要检查浏览器的cookie值。如果找到了,user identify就会以FormsIdentity类的形式保存在cookie中,这个类包含了认证用户的如下信息:
AthenticationType
- returns the value Forms
IsAthenticated
- returns a boolean value indicating where the user was authenticated
Name
- Indicates the name of an authenticated user
因为FormsIdentity类只包含了用户的name属性,但是我们往往需要大量的信息,而不止于Name。因此我就写了这个SiteIdentity类,它实现了IIdentity接口,包含了认证用户的更多信息。
Creating the Login Page
登录页面包含两个文本框让用户输入电子邮件和密码,也许还可以放一个选项框,让用户选择是否要保持永久cookie,最后放一个submit按钮,Onclick事件处理如下:
private void Submit_Click(object sender, System.EventArgs e)
{
// call the ValidateLogin static method to
// check if the email and password are correct
// if correct the method will return a new user else return null
SitePrincipal newUser =
SitePrincipal.ValidateLogin(Email.Text, Password.Text);
if (newUser == null)
{
ErrorMessage.Text = "Login failed for " + Email.Text;
ErrorMessage.Visible = true;
}
else
{
// assign the new user to the current context user
Context.User = newUser;
// set the cookie that contains the email address
// the true value means the cookie will be set persisted
FormsAuthentication.SetAuthCookie( Email.Text, true );
// redirect the user to the home page
Response.Redirect("Default.aspx");
}
}
Authenticating User On Every Request
主要是实现了一个所有页面都要继承的基类,所有继承自它的页面都会包含我们自定义的SiteProcipal实例信息:
public class PageBase: System.Web.UI.Page
{
public PageBase()
{
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
this.Load += new System.EventHandler(this.PageBase_Load);
}
private void PageBase_Load(object sender, System.EventArgs e)
{
if (Context.User.Identity.IsAuthenticated)
{
if (!(Context.User is SitePrincipal))
{
SitePrincipal newUser =
new SitePrincipal( Context.User.Identity.Name );
Context.User = newUser;
}
}
}
}
以后所有的页面都要继承自此页,而非System.Web.UI.Page,因此,如果此时想得到用户的信息就简单了:
if (Context.User.Identity.IsAuthenticated)
{
string name = ((SiteIdentity)Context.User.Identity).FullName;
string email = ((SiteIdentity)Context.User.Identity).Email;
string password = ((SiteIdentity)Context.User.Identity).Password;
string userID = ((SiteIdentity)Context.User.Identity).UserID;
}
或者你可以查看当前用户的角色:
if (Context.User.Identity.IsAuthenticated)
{
if (!((SitePrincipal)Context.User).IsInRole("Site Admin"))
Response.Redirect("Login.aspx");
}
The Demo Application
下载地址如下:
分享到:
相关推荐
- 可以自定义未授权和未认证的处理方式,比如重定向到特定页面或者返回JSON响应。 综上所述,这个Spring Security的例子展示了如何结合数据库动态配置用户信息,实现认证和授权功能。通过理解并实践这些概念,...
本文讨论了一种改进的基于角色的分级授权访问控制模型(RBAC),旨在解决大多数企业在业务处理过程中对于功能访问权限和数据访问权限的高要求。传统基于角色的访问控制模型在数据访问控制方面的能力有限,这在很大...
综上所述,Spring Cloud下的OAuth2认证授权实现涉及多个组件和流程的协调,包括授权服务器、资源服务器、客户端注册、授权流程、令牌管理和安全配置。理解并熟练掌握这些知识点对于构建安全的微服务架构至关重要。...
# 基于Spring Boot和Spring Security的OAuth2认证与授权系统 ## 项目简介 本项目是一个基于Spring Boot和Spring Security框架的OAuth2认证与授权系统,旨在提供一个安全、可靠的用户认证和授权解决方案。系统支持...
本项目是一个基于Spring Boot和Spring Cloud框架的认证授权系统,主要用于实现用户认证、授权、角色管理等功能。系统集成了Spring Security、OAuth2、JWT、Redis、MySQL等技术,提供了完整的认证授权解决方案。 ## ...
这几天小明又有烦恼了,之前给小红的接口没有做认证授权,直接裸奔在线上,被马老板发现后狠狠的骂了一顿,赶紧让小明把授权加上。赶紧Baidu一下,发现大家都在用JWT认证授权,这个倒是挺适合自己的。 什么是Token ...
在Form认证的基础上,MVC支持基于角色的授权,允许对用户进行更细粒度的权限控制。通过`[Authorize(Roles = "Role1, Role2")]`特性,可以限制只有指定角色的用户才能访问特定的控制器或操作方法。此外,还可以使用`...
在.NET MVC框架中,身份认证和授权是两个关键的安全机制,用于确保只有授权的用户能够访问应用程序的特定资源。这两个概念在Web应用开发中扮演着至关重要的角色,尤其是在处理敏感数据或提供私有服务时。 身份认证...
综上所述,本专利提出的技术方案为现有的统一认证授权体系提供了一种更为高效、灵活且可靠的解决方案。通过实现业务系统细粒度的反向授权,不仅可以显著提高企业的信息化管理水平,还能为企业带来更多的竞争优势。...
通过合理的配置和使用,不仅可以实现用户级别的身份验证,还可以轻松实现基于角色的授权,从而提高系统的安全性和易用性。对于需要高度定制化的身份验证和授权流程的应用程序而言,Forms身份验证是一个理想的选择。
# 基于Spring Security和Spring Boot的认证与授权系统 ## 项目简介 本项目是一个基于Spring Boot和Spring Security框架的认证与授权系统,旨在提供一个安全可靠的用户认证和权限管理解决方案。项目涵盖了多种认证...
Shiro 认证授权框架是 Java 中一种流行的认证授权解决方案,提供了完整的认证和授权机制,能够满足大多数应用程序的安全需求。Shiro 框架的核心思想是将认证和授权分离,认证负责验证用户身份的合法性,而授权则负责...
- **集成认证中心**:处理用户的登录验证,执行身份认证,并负责授权和管理。它还具备监控预警功能,能及时发现异常登录行为,同时提供应用代理服务,帮助用户平滑地接入各种应用。 - **信任域内资源整合系统**:...
理解并熟练掌握角色授权和认证授权是成为合格的HCIE-Security专家的关键,这对于设计和实施安全的网络环境至关重要。通过深入学习和实践,考生可以更好地应对HCIE-Security考试,为自己的职业生涯铺平道路。
这是一个实现基于角色的访问控制的身份验证和授权库,它将被插入到 Spring Security Framework 中。 特征 基于角色的授权。 可以使用 SPEL 表达式进行配置。 本地身份验证提供程序。 密码使用 HMAC-SHA256 编码。 ...
基于角色的权限控制(Role-Based Access Control,简称RBAC)是一种有效的访问控制策略,它将权限与角色关联,用户通过角色获取相应的权限。在大型系统中,这种模型能够有效地简化权限管理和分配,尤其是在用户数量...
除了基于用户的身份验证,Asp.NET还支持基于角色的授权。这允许你为不同类型的用户提供不同的访问权限。例如,你可以创建角色如“Admin”,“Member”,并分配不同的权限。当用户登录时,他们的角色信息会被包含在...
在.NET框架中,C#提供了一种强大的身份验证和授权机制,称为“基于角色的验证”(Role-Based Authentication)。这个机制允许开发人员根据用户的角色来控制对应用程序资源的访问,从而实现更精细的安全管理。本篇...