重新过一遍ASP.NET 2.0(C#)(6) - Membership&RoleManager(成员资格和角色管理)


重新过一遍ASP.NET 2.0(C#)(6) - Membership&RoleManager(成员资格和角色管理)


作者: webabcd


介绍
现在 ASP.NET 2.0 提供了对成员资格(用户名/密码凭据存储)和角色管理服务的内置支持。由于所有这些服务都是提供程序驱动的(Provider),因此可以方便地用您自己的自定义实现替换。


关键
1、基于Windows的身份验证将<system.web>元素下的<authentication> 设置为 Windows;基于Forms的身份验证将<system.web>元素下的<authentication> 设置为 Forms。

2、基于Forms的身份验证时,设置<system.web>元素下的<authentication> 元素的 <forms> 子元素,示例如下,仅为说明
     < authentication  mode ="Forms" >

      
< forms  name =".VS2005_Form"  loginUrl ="~/Security/Login.aspx"  defaultUrl ="~/Default.aspx"
          protection
="All"  timeout ="30"  path ="/"  requireSSL ="false"
          slidingExpiration
="true"  enableCrossAppRedirects ="false"
          cookieless
="UseDeviceProfile" >
      
</ forms >

    
</ authentication >

<forms>元素的属性说明如下
1) cookieless - 身份验证可以将 Forms 身份验证票存储在 Cookie 中也可以以无 Cookie 的表示形式存储在 URL 上。有效值如下:
  ·UseDeviceProfile - 默认值表示 ASP.NET 根据预先计算得到的浏览器配置文件来确定存储票证的位置。
  ·AutoDetect - 选项使 ASP.NET 动态确定浏览器是否支持 Cookie。
  ·UseUri - 强制实施无 Cookie 票证 
  ·UseCookies - 强制实施有 Cookie 票证。
2) defaultUrl - 指定在成功登录后,请求将重定向到的默认 URL。
3) domain - 指定包含 Forms 身份验证票的 HttpCookie 的 Domain 属性的值。显式设置此属性可使应用程序共享同一个 Cookie,前提是这些应用程序共享某个 DNS 命名空间的一个公共部分(例如,如果 domain 属性设置为“cnblogs.com”,则 webabcd.cnblogs.com 和 dudu.cnblogs.com可以共享一个 Cookie)。
4) enableCrossAppRedirects - Forms 身份验证允许以查询字符串变量或窗体 POST 变量的形式在应用程序之间传递 Forms身份验证票。将此属性设置为 true 可使 FormsAuthenticationModule 能够从查询字符串或窗体 POST 变量提取票证。
5) loginUrl - 指定未经身份验证的用户的请求将被重定向到的 URL。该 URL 可以在同一台计算机上或在远程计算机上。如果是在远程计算机上,则两台计算机上 machineKey 配置元素中的 decryptionkey 和 validationKey 属性都需要使用相同的值。
6) name - 用于身份验证的 HTTP Cookie 的名称。注意,如果多个应用程序需要在一台计算机上使用基于窗体的身份验证服务,并且每个应用程序都希望由应用程序隔离 Forms 身份验证 Cookie,则每个应用程序都应配置一个唯一的 Cookie 值。为避免在 URL 中产生依赖项,在设置身份验证 Cookie 时,ASP.NET 还使用“/”作为 Path 值,以便将这些 Cookie 发送回站点上的每个应用程序。
7) path - 用于发出的 Cookie 的路径。默认值为“/”,以避免路径中大小写不匹配的造成的困难,因为在返回 Cookie 时,浏览器是严格区分大小写的。共享服务器环境中的应用程序应使用此指令来维护专用 Cookie。(它们还可以使用 API 在运行时指定路径来发出 Cookie。)
8) protection - 用于保护 Cookie 数据的方法。有效值如下: 
  ·All - 同时使用数据验证和加密来保护 Cookie。所配置的数据验证算法是基于 <machinekey> 元素的。如果密钥足够长(48 个字符),默认情况下将使用 AES 进行加密。All 是默认(和建议)值。 
  ·None - 用于仅将 Cookie 用于个性化设置并且安全性要求不高的站点。加密和验证都可以被禁用。尽管以此方式使用 Cookie 需谨慎,但对于使用 .NET Framework 实现个性化设置的任何方法,此设置提供了最佳性能。 
  ·Encryption - 使用 AES、TripleDES 或 DES 加密 Cookie,但不对 Cookie 进行数据验证。这类 Cookie 容易受到精心选择的纯文本的攻击。
  ·Validation - 不加密 Cookie 的内容,但验证 Cookie 数据在传输过程中是否未被更改。若要创建 Cookie,验证密钥在缓冲区中与 Cookie 数据连接,并且计算出 MAC 并将其追加到输出的 Cookie。
9) requireSSL - 如果设置为 true,则 Forms 身份验证会设置 Forms 身份验证 Cookie 的安全位。兼容的浏览器只将 Cookie 通过 SSL 连接发送回 ASP.NET。注意,如果使用无 Cookie Forms 身份验证,则此设置无效。
10) slidingExpiration - 如果设置为 true,则 Forms 身份验证将定期更新 Forms 身份验证票的生存期。无论票证是包含在 Cookie 中,还是以无 Cookie 的格式包含在 URL 中,都会进行此操作。
11) timeout - 时间量(以整数分钟为单位),经过该时间量之后,Cookie 则会过期。默认值是 30。超时属性是一个可调值,从收到上次请求的时间开始计算,它将在 n 分钟后过期。为了避免对性能产生负面影响,也为了避免那些打开了 Cookie 警告的应用程序产生多个浏览器警告,Cookie 在超时时间过半时更新。(这意味着在某些情况下可能会出现精度损失。)

3、授权用户和角色设置<system.web>元素下的<authorization>元素,示例如下,仅为说明
< authorization >
    
< allow  VERB ="POST"  users ="webabcd@gmail.com"   />
    
< allow  roles ="admin"   />
    
< deny  users ="*"   />
    
< allow  VERB ="GET"  users ="abc,xyz"   />
    
< deny  users ="?"   />
</ authorization >

注:可以把授权用户和角色设置的配置写在某个文件夹内,则所做的配置只作用于该文件夹内,自动继承外面的配置。
allow - 允许
deny - 拒绝
users - 用户(多用户用逗号隔开)
roles - 角色(多角色用逗号隔开)
verb - 指定http方法,post或get
* - 所有用户
? - 匿名(未经过身份验证的)用户

4、分路径设置授权用户和角色设置,示例如下,仅为说明
     < location  path ="folder" >
        
< system .web >
            
< authorization >
                
< deny  users ="?" />
                
< allow  users ="*" />
            
</ authorization >
        
</ system.web >
    
</ location >
    
    
< location  path ="abc.aspx" >
        
< system .web >
            
< authorization >
                
< allow  roles ="Administrators"   />
                
< deny  users ="*" />
            
</ authorization >
        
</ system.web >
    
</ location >

<location>元素的path属性可以是文件夹也可以是某一文件

5、<membership>元素设置,示例如下,仅为说明
     < membership  defaultProvider ="SqlMembershipProvider" >
      
< providers >
        
< clear />
        
< add  name ="SqlMembershipProvider"
             type
="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
             connectionStringName
="SqlConnectionString"
             enablePasswordRetrieval
="false"
             enablePasswordReset
="true"
             requiresQuestionAndAnswer
="false"
             applicationName
="/"
             requiresUniqueEmail
="false"
             passwordFormat
="Hashed"
             maxInvalidPasswordAttempts
="3"
             minRequiredPasswordLength
="3"
             minRequiredNonalphanumericCharacters
="0"
             passwordAttemptWindow
="10"
             passwordAnswerAttemptLockoutDuration
="15"  
             passwordStrengthRegularExpression
=""   />
      
</ providers >
    
</ membership >

enablePasswordRetrieval - 是否可以检索用户密码(总是false)
enablePasswordReset - 是否允许用户重置其密码
requiresQuestionAndAnswer - 是否要求在创建用户时提供密码提示问题和答案
applicationName - 自定义成员资格提供程序的应用程序的名称
requiresUniqueEmail - 电子邮件地址是否必须是唯一的
passwordFormat - 存储的密码的格式
maxInvalidPasswordAttempts - 用户回答密码重置问题时允许失败的次数
minRequiredPasswordLength - 密码所要求的最小长度
minRequiredNonalphanumericCharacters - 有效密码中必须包含的最少特殊字符数
passwordAttemptWindow - 连续未能正确回答密码重置问题的次数进行跟踪的时间长度(单位:分钟)
passwordAnswerAttemptLockoutDuration - 用户多次未能正确回答密码提示问题后用户帐户的锁定时间长度(单位:分钟)
passwordStrengthRegularExpression - 用于验证密码的正则表达式

上面示例中的部分解释如下
如果用户在 10 分钟内三次未能正确回答密码提示问题,该用户即被锁定。如果用户被锁定,则在 15 分钟内,用户不能再回答密码提示问题

6、<roleManager>元素设置,示例如下,仅为说明
     < roleManager  defaultProvider ="SqlRoleProvider"
      enabled
="true"
      cacheRolesInCookie
="true"
      cookieName
=".VS2005_Role"
      cookieTimeout
="30"
      cookiePath
="/"
      cookieRequireSSL
="false"
      cookieSlidingExpiration
="true"
      cookieProtection
="All" >
      
< providers >
        
< add
          
name ="SqlRoleProvider"
          type
="System.Web.Security.SqlRoleProvider"
          connectionStringName
="SqlConnectionString"
          applicationName
="/"   />
      
</ providers >
    
</ roleManager >

各属性详细说明参看MSDN,索引处查找“roleManager 元素”

7、使用加密密码
< authentication >
    
< credentials  passwordFormat ="SHA1"   >
        
< user  name ="Mary"  password ="94F85995C7492EEC546C321821AA4BECA9A3E2B1" />
        
< user  name ="John"  password ="5753A498F025464D72E088A9D5D6E872592D5F91" />
    
</ credentials >
</ authentication >

使用FormsAuthentication.HashPasswordForStoringInConfigFile(String password, String passwordFormat)生成密码
Clear - 密码以明文形式存储
SHA1 - 密码存储为 SHA1 摘要
MD5 - 密码存储为 MD5 摘要

8、使用用户帐户模拟,在<system.web>元素下加如下元素
< identity  impersonate ="true"  username =""  password =""   />

9、常用的就是如下这些东东
System.Web.Security.Membership,System.Web.Security.MembershipUser,System.Web.Security.Roles,Page.User
FormsAuthentication.RedirectFromLoginPage,FormsAuthentication.SetAuthCookie,FormsAuthentication.SignOut
重写那些Provider的话,参看源码中微软提供的示例


示例
读取用户名和验证类型
Security/Test.aspx
<% @ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Test.aspx.cs"
    Inherits
="Security_Test" Title="读取用户名和验证类型" 
%>

< asp:Content  ID ="Content1"  ContentPlaceHolderID ="ContentPlaceHolder1"  runat ="Server" >
    
< p >
        用户名称:
        
<% = User.Identity.Name  %>
        
< br  />
        验证类型:
        
<% = User.Identity.AuthenticationType  %>
    
</ p >
</ asp:Content >

Membership测试
App_Code/User.cs
using  System;
using  System.Data;
using  System.Configuration;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;

using  System.ComponentModel;

/**/ /// <summary>
/// User 的摘要说明
/// </summary>

[DataObject( true )]
public   class  User
{
    
public User()
    
{
        
//
        
// TODO: 在此处添加构造函数逻辑
        
//
    }


    
/**//// <summary>
    
/// 获得所有用户
    
/// </summary>
    
/// <returns></returns>

    [DataObjectMethod(DataObjectMethodType.Select, true)]
    
public MembershipUserCollection GetMembers()
    
{
        MembershipUserCollection muc 
= Membership.GetAllUsers();
        
return muc;
    }


    
/**//// <summary>
    
/// 删除用户
    
/// </summary>
    
/// <returns></returns>

    [DataObjectMethod(DataObjectMethodType.Delete, true)]
    
public void DeleteMember(string username)
    
{
        Membership.DeleteUser(username, 
true);
    }

}


Security/User.aspx
<% @ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="User.aspx.cs"
    Inherits
="Security_User" Title="Membership测试" 
%>

< asp:Content  ID ="Content1"  ContentPlaceHolderID ="ContentPlaceHolder1"  runat ="Server" >
    
< p >
        
< asp:Label  ID ="lblMsg"  runat ="Server"  ForeColor ="red"   />
    
</ p >
    
< p >
        用户名:
        
< asp:TextBox  ID ="txtUsername"  runat ="server" ></ asp:TextBox >
    
</ p >
    
< p >
        密
&nbsp;&nbsp;&nbsp;&nbsp; 码:
        
< asp:TextBox  ID ="txtPassword"  runat ="server" ></ asp:TextBox >
    
</ p >
    
< p >
        
< asp:Button  ID ="btnSubmit"  runat ="server"  Text ="添加"  OnClick ="btnSubmit_Click"   />
    
</ p >
    
< p >
        
< asp:GridView  ID ="GridView1"  runat ="server"  DataKeyNames ="UserName"  AutoGenerateColumns ="False"
            DataSourceID
="ObjectDataSource1" >
            
< Columns >
                
< asp:CommandField  ShowDeleteButton ="True"   />
                
< asp:BoundField  DataField ="ProviderName"  HeaderText ="ProviderName"  ReadOnly ="True"
                    SortExpression
="ProviderName"   />
                
< asp:CheckBoxField  DataField ="IsOnline"  HeaderText ="IsOnline"  ReadOnly ="True"  SortExpression ="IsOnline"   />
                
< asp:BoundField  DataField ="LastPasswordChangedDate"  HeaderText ="LastPasswordChangedDate"
                    ReadOnly
="True"  SortExpression ="LastPasswordChangedDate"   />
                
< asp:BoundField  DataField ="PasswordQuestion"  HeaderText ="PasswordQuestion"  ReadOnly ="True"
                    SortExpression
="PasswordQuestion"   />
                
< asp:CheckBoxField  DataField ="IsLockedOut"  HeaderText ="IsLockedOut"  ReadOnly ="True"
                    SortExpression
="IsLockedOut"   />
                
< asp:BoundField  DataField ="Comment"  HeaderText ="Comment"  SortExpression ="Comment"   />
                
< asp:BoundField  DataField ="UserName"  HeaderText ="UserName"  ReadOnly ="True"  SortExpression ="UserName"   />
                
< asp:BoundField  DataField ="Email"  HeaderText ="Email"  SortExpression ="Email"   />
                
< asp:BoundField  DataField ="CreationDate"  HeaderText ="CreationDate"  ReadOnly ="True"
                    SortExpression
="CreationDate"   />
                
< asp:CheckBoxField  DataField ="IsApproved"  HeaderText ="IsApproved"  SortExpression ="IsApproved"   />
                
< asp:BoundField  DataField ="LastLockoutDate"  HeaderText ="LastLockoutDate"  ReadOnly ="True"
                    SortExpression
="LastLockoutDate"   />
                
< asp:BoundField  DataField ="LastLoginDate"  HeaderText ="LastLoginDate"  SortExpression ="LastLoginDate"   />
                
< asp:BoundField  DataField ="LastActivityDate"  HeaderText ="LastActivityDate"  SortExpression ="LastActivityDate"   />
            
</ Columns >
        
</ asp:GridView >
        
< asp:ObjectDataSource  ID ="ObjectDataSource1"  runat ="server"  SelectMethod ="GetMembers"
            TypeName
="User"  DeleteMethod ="DeleteMember" >
            
< DeleteParameters >
                
< asp:Parameter  Name ="username"  Type ="String"   />
            
</ DeleteParameters >
        
</ asp:ObjectDataSource >
    
</ p >
    
< p >
        备注:
< br  />
        用户和角色之间的操作如下
< br  />
        Roles.AddUserToRole - 向角色添加用户
< br  />
        Roles.RemoveUserFromRole - 从角色删除用户
< br  />
        Roles.GetRolesForUser - 用户所属的角色列表
< br  />
    
</ p >
</ asp:Content >

Security/User.aspx.cs
using  System;
using  System.Data;
using  System.Configuration;
using  System.Collections;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;

public  partial  class  Security_User : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{

    }


    
protected void btnSubmit_Click(object sender, EventArgs e)
    
{
        MembershipCreateStatus status;
        Membership.CreateUser(txtUsername.Text.Trim(), txtPassword.Text.Trim(), 
nullnullnulltrueout status);

        
string strInsertMessage = "";

        
switch (status)
        
{
            
case MembershipCreateStatus.Success:

                
break;
            
case MembershipCreateStatus.DuplicateUserName:
                strInsertMessage 
= "用户名重复";
                
break;
            
case MembershipCreateStatus.InvalidUserName:
                strInsertMessage 
= "用户名输入错误";
                
break;
            
case MembershipCreateStatus.InvalidPassword:
                strInsertMessage 
= "密码输入不符合要求";
                
break;
            
default:
                strInsertMessage 
= "出现未知错误";
                
break;
        }


        
if (strInsertMessage != "")
        
{
            lblMsg.Text 
= strInsertMessage;
        }

        
else
        
{
            lblMsg.Text 
= "注册成功";
            GridView1.DataBind();
        }

    }

}



RoleManager测试
App_Code/Role.cs
using  System;
using  System.Data;
using  System.Configuration;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;

using  System.Collections.Generic;
using  System.ComponentModel;

/**/ /// <summary>
/// Role 的摘要说明
/// </summary>

[DataObject( true )]
public   class  Role
{
    
public Role()
    
{
        
//
        
// TODO: 在此处添加构造函数逻辑
        
//
    }


    
/**//// <summary>
    
///  得到所有角色
    
/// </summary>
    
/// <param name="userName">用户名称</param>
    
/// <returns></returns>

    [DataObjectMethod(DataObjectMethodType.Select, true)]
    
static public List<RoleData> GetRoles()
    
{
        RoleData r 
= null;
        List
<RoleData> roleList = new List<RoleData>();
        
string[] ary = Roles.GetAllRoles();

        
foreach (string s in ary)
        
{
            r 
= new RoleData();
            r.RoleName 
= s;

            roleList.Add(r);
        }


        
return roleList;
    }


    
/**//// <summary>
    
/// 删除角色
    
/// </summary>
    
/// <param name="roleName">角色名称</param>

    [DataObjectMethod(DataObjectMethodType.Delete, true)]
    
static public void DeleteRole(string roleName)
    
{
        MembershipUserCollection muc 
= Membership.GetAllUsers();
        
string[] allUserNames = new string[1];

        
foreach (MembershipUser mu in muc)
        
{
            
if (Roles.IsUserInRole(mu.UserName, roleName))
            
{
                allUserNames[
0= mu.UserName;
                Roles.RemoveUsersFromRole(allUserNames, roleName);
            }

        }

        Roles.DeleteRole(roleName);
    }

}


/**/ /// <summary>
/// 角色的实体类
/// </summary>

public   class  RoleData
{
    
protected string _roleName;

    
/**//// <summary>
    
/// 角色名称 关键字
    
/// </summary>

    [DataObjectField(true)]
    
public string RoleName
    
{
        
get return this._roleName; }
        
set this._roleName = value; }
    }

}


Security/Role.aspx
<% @ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Role.aspx.cs"
    Inherits
="Security_Role" Title="RoleManager测试" 
%>

< asp:Content  ID ="Content1"  ContentPlaceHolderID ="ContentPlaceHolder1"  runat ="Server" >
    
< p >
        
< asp:Label  ID ="lblMsg"  runat ="Server"  ForeColor ="red"   />
    
</ p >
    
< p >
        角色名:
        
< asp:TextBox  ID ="txtRolename"  runat ="server" ></ asp:TextBox >
    
</ p >
    
< p >
        
< asp:Button  ID ="btnSubmit"  runat ="server"  Text ="添加"  OnClick ="btnSubmit_Click"   />
    
</ p >
    
< p >
        
< asp:GridView  ID ="GridView1"  runat ="server"  DataKeyNames ="RoleName"  DataSourceID ="ObjectDataSource1"  AutoGenerateColumns ="False" >
            
< Columns >
                
< asp:CommandField  ShowDeleteButton ="True"   />
                
< asp:BoundField  DataField ="RoleName"  HeaderText ="RoleName"  ReadOnly ="True"
                    SortExpression
="RoleName"   />
            
</ Columns >
        
</ asp:GridView >
        
< asp:ObjectDataSource  ID ="ObjectDataSource1"  runat ="server"  DeleteMethod ="DeleteRole"
            SelectMethod
="GetRoles"  TypeName ="Role" >
            
< DeleteParameters >
                
< asp:Parameter  Name ="roleName"  Type ="String"   />
            
</ DeleteParameters >
        
</ asp:ObjectDataSource >
    
</ p >
    
< p >
         备注:
< br  />
         用户和角色之间的操作如下
< br  />
         Roles.AddUserToRole - 向角色添加用户
< br  />
         Roles.RemoveUserFromRole - 从角色删除用户
< br  />
         Roles.GetRolesForUser - 用户所属的角色列表
< br  />
    
</ p >
</ asp:Content >

Security/Role.aspx.cs
using  System;
using  System.Data;
using  System.Configuration;
using  System.Collections;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;

public  partial  class  Security_Role : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{

    }


    
protected void btnSubmit_Click(object sender, EventArgs e)
    
{
        
if (Roles.RoleExists(txtRolename.Text.Trim()))
        
{
            lblMsg.Text 
= "该角色已存在";
        }

        
else
        
{
            Roles.CreateRole(txtRolename.Text.Trim());
            GridView1.DataBind();
        }

    }

}



注:需要用aspnet_regsql配置数据库


OK

转载于:https://www.cnblogs.com/think-jerry/archive/2007/05/17/750420.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP.NET Core Identity 是 ASP.NET Core 框架提供的一种身份认证和授权框架,它可以用于管理用户、角色和权限。 下面是使用 ASP.NET Core Identity 的步骤: 1. 首先,要在 ASP.NET Core 项目中安装 Microsoft.AspNetCore.Identity 包。 2. 接着,在 Startup.cs 文件中配置 Identity 服务。可以使用 AddIdentity() 方法来配置 Identity,默认情况下会将 Identity 存储在内存中,但这并不适合生产环境。因此,我们需要配置 Identity 存储提供程序。例如,可以使用 Entity Framework Core 来存储 Identity 数据。如果要使用 Entity Framework Core,可以使用 AddEntityFrameworkStores() 方法将 Identity 存储在数据库中。 ```csharp public void ConfigureServices(IServiceCollection services) { // 添加 Identity 服务 services.AddIdentity<IdentityUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); // 添加其他服务 services.AddControllersWithViews(); } ``` 3. 然后,需要创建一个 ApplicationDbContext 类来表示 Identity 数据库上下文。这个类需要继承 IdentityDbContext 类,并指定 IdentityUser 和 IdentityRole 类型。 ```csharp public class ApplicationDbContext : IdentityDbContext<IdentityUser, IdentityRole, string> { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } } ``` 4. 在 ConfigureServices() 方法中,还需要配置身份认证和授权选项。例如,可以配置密码复杂性要求、登录尝试锁定、cookie 配置等等。 ```csharp public void ConfigureServices(IServiceCollection services) { // 添加 Identity 服务 services.AddIdentity<IdentityUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); // 配置身份认证和授权选项 services.Configure<IdentityOptions>(options => { // 密码复杂性要求 options.Password.RequireDigit = true; options.Password.RequireLowercase = true; options.Password.RequireNonAlphanumeric = true; options.Password.RequireUppercase = true; options.Password.RequiredLength = 8; // 登录尝试锁定 options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5); options.Lockout.MaxFailedAccessAttempts = 5; // cookie 配置 options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(7); options.Cookies.ApplicationCookie.LoginPath = "/Account/Login"; options.Cookies.ApplicationCookie.LogoutPath = "/Account/Logout"; }); // 添加其他服务 services.AddControllersWithViews(); } ``` 5. 最后,在应用程序中使用 Identity API 来管理用户、角色和权限。例如,可以在控制器中使用 UserManager 和 RoleManager 类来创建、删除和修改用户和角色。 ```csharp public class AccountController : Controller { private readonly UserManager<IdentityUser> _userManager; private readonly SignInManager<IdentityUser> _signInManager; private readonly RoleManager<IdentityRole> _roleManager; public AccountController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager, RoleManager<IdentityRole> roleManager) { _userManager = userManager; _signInManager = signInManager; _roleManager = roleManager; } public IActionResult Register() { return View(); } [HttpPost] public async Task<IActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new IdentityUser { UserName = model.Email, Email = model.Email }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { await _signInManager.SignInAsync(user, isPersistent: false); return RedirectToAction("Index", "Home"); } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } return View(model); } public async Task<IActionResult> CreateRole() { var result = await _roleManager.CreateAsync(new IdentityRole("Admin")); if (result.Succeeded) { return Ok(); } return BadRequest(); } } ``` 以上就是使用 ASP.NET Core Identity 来管理用户和角色的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值