熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

Asp.Net Forms驗證實例

2013-11-13 09:57:06  來源: .NET編程 

  以前開發項目時經常是自己開發一套用戶權限管理系統進行驗證比較靈活最近為了單點登錄的問題又把AspNet自帶的驗證方式看了一遍發現這種方式也比較方便功能也還可以在AspNet提供了三種常用的驗證方式Windows方式是和IIS結合起來可以實現基本摘要集成 Windows等身份驗證Passport方式是使用Windows Live ID的帳戶來進行統一驗證的Forms方式是使用常見的表單來實現驗證
普通實現方式
   
    這種方式是最簡單的只需要配置一下就可以了
   
   執行aspnet_regsql命令建立數據庫
   
    aspnet_regsql命令在C:\WINDOWS\MicrosoftNET\Framework\v目錄下按提示運行就可以了

  新建一個web網站
   
    在WebConfig中加入配置

  <connectionStrings>
        <add name=MySqlConnection connectionString=Data Source=dbserver;Initial Catalog=database;user id=userid;password=****; />
      </connectionStrings>

  <systemweb>
            <authorization>
                <deny users=?/>
            </authorization>
            <authentication mode=Forms>
                <forms loginUrl=loginaspx name=ASPXAUTH/>
            </authentication>

  <membership defaultProvider=SqlProvider>
          <providers>
            <clear />
            <add connectionStringName=MySqlConnection applicationName=MyApplication
              enablePasswordRetrieval=false enablePasswordReset=true requiresQuestionAndAnswer=true
              requiresUniqueEmail=true passwordFormat=Hashed name=SqlProvider
              type=SystemWebSecuritySqlMembershipProvider />
          </providers>
        </membership>

  </systemweb>主要就是指定Forms驗證使用的數據庫如果不指定數據庫會使用本機默認的aspnetdb 數據庫
    deny users=?表示不允許匿名用戶訪問也就是說當匿名用戶訪問時自動跳轉到下面配置的loginaspx頁面
    至於authorization和authentication節的其他屬性可以參考MSDN裡面有很詳細的介紹

  在網站裡創建Defaultaspx和Loginaspx頁面
   
    在Loginaspx頁面裡面放入Login和CreateUserWizard控件(因為我們新建的庫中一個用戶也沒有CreateUserWizard控件只是用來建立測試用戶的建好用戶後可以把這個控件刪除)
    在Defaultaspx頁面中隨便放入一些內容
    當我們訪問Defaultaspx時就會自動轉入Loginaspx進行驗證了

  自定義實現方式
   
    采用第一種方式時會要求建立一個數據庫很多表可能並不符合我們自己的業務要求可以使用以下的自定義方式
利用Login控件的Authenticate事件
    這個事件就是用來進行驗證的可以通過指定true值表示驗證通過
        protected void Login_Authenticate(object sender AuthenticateEventArgs e)
        {
            //判斷用戶名密碼是否正確
            //
            eAuthenticated = true;
        }
    完全拋開Login等控件自己寫代碼
    其實Login控件的核心主要也就是往Cookie裡面放入一些值那麼我們可以在自己的代碼中來進行這個操作

  protected void Button_Click(object sender EventArgs e)
        {
            //判斷用戶名密碼是否正確
            //
            FormsAuthenticationSetAuthCookie(userName false);
            if (ContextRequest[ReturnUrl] != null)
            {
                ResponseRedirect(ContextRequest[ReturnUrl]);
            }
            else
            {
                ResponseRedirect(FormsAuthenticationDefaultUrl);
            }
        }采用以上兩種方式就不用建立默認的數據庫了直接使用我們的邏輯進行驗證操作

  自定義角色提供程序
   
    以上說的都是用戶級別的驗證在有的情況下需要根據角色來進行驗證比如指定某個目錄或某個aspx文件只能讓哪幾個角色的用戶訪問根據角色來控制的話比較方便靈活
   在登錄驗證的時候把角色信息也保存到Cookie中去

        protected void Button_Click(object sender EventArgs e)
        {
            //判斷用戶名密碼是否正確
            //

  //得到用戶的角色測試時暫時寫死
            string userRoles = Adminstestst;
            FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket( user DateTimeNow DateTimeNowAddMinutes() false userRoles /);
            string HashTicket = FormsAuthenticationEncrypt(Ticket);

  //把角色信息保存到Cookie中去
            HttpCookie UserCookie = new HttpCookie(FormsAuthenticationFormsCookieName HashTicket);
            ResponseCookiesAdd(UserCookie);

  if (ContextRequest[ReturnUrl] != null)
            {
                ResponseRedirect(ContextRequest[ReturnUrl]);
            }
            else
            {
                ResponseRedirect(FormsAuthenticationDefaultUrl);
            }
        }把角色信息加密成特定的格式保存


自定義角色提供程序
   
    如果要按照角色進行驗證的話肯定要涉及到角色提供程序在默認情況下也是會去連接默認的數據庫的我們可以自己寫一個角色提供程序來實現自己的邏輯
    首先在nfig中加入配置
    Code
        <roleManager defaultProvider=MyRoleProvider
          enabled=true
          cacheRolesInCookie=true
          cookieName=ASPROLES
          cookieTimeout=
          cookiePath=/
          cookieRequireSSL=false
          cookieSlidingExpiration=true
          cookieProtection=All >
          <providers>
            <clear />
            <add name=MyRoleProvider
              type=MyRoleProvider
              writeExceptionsToEventLog=false />
          </providers>
        </roleManager>這個就是指定我們的角色提供類MyRoleProvider
        這個類必須從SystemWebSecurityRoleProvider繼承只要重載實現一個方法就可以了(其他方法返回異常)
        public override string[] GetRolesForUser(string username)
        {
            FormsIdentity Id = HttpContextCurrentUserIdentity as FormsIdentity;
            if (Id != null)
            {
                return IdTicketUserDataSplit(new Char[] { });
            }
            return null;
        }也就是從我們之前保存到Cookie中的值取得用戶角色(FormsAuthentication會自動把保存的cookie轉化成User內的值)

  之後我們就可以在nfig中配置角色驗證規則了
      <location path=admin>
        <systemweb>
          <authorization>
            <allow roles=Admins/>
            <deny users=*/>
          </authorization>
        </systemweb>
      </location>或者也可以在代碼中判斷
    bool a = UserIsInRole(testt);判斷起來還是很方便的

  單點登錄
   
    使用Forms的單點登錄主要是通過machineKey的配置machineKey 元素對密鑰進行配置以便將其用於對 Forms 身份驗證 Cookie 數據和視圖狀態數據進行加密和解密並將其用於對進程外會話狀態標識進行驗證
    使用這種方式的單點登錄目前只能實現相同主機或相同子域站點之間的同步登錄比如和可以實現但是和就不能實現了對於非同一父域名下的域名間不能跨站登錄
    主要配置如下
      <machineKey validationKey=EEBFACBCCDFDDDEAEEADFBDDBFAFECCCDBDBDDD decryptionKey=BCBCABADFAABFDFD validation=SHA/>
      <authentication mode=Forms>
          <forms loginUrl=loginaspx name=ASPXAUTH domain= />
      </authentication>要實現單點登錄的多個web站點的machineKey必須一樣forms裡面的name和domain也必須一樣
    這樣配置好之後在其中一個站點登錄後再調轉到另一個站點就不需要再次登錄了
    注如果MOSS網站采用Forms驗證方式的話只要把MOSS站點的對應配置改成和自己的AspNet站點一致那麼可以從自己的站點直接進入MOSS站點也不需要重新登錄(MOSS站點和自己的站點要有相同的用戶名)

  其他
    Forms驗證之後可以使用以下方法退出登錄
    FormsAuthenticationSignOut();
    另外這些登錄的後台Module是配置在C:\WINDOWS\MicrosoftNET\Framework\v\CONFIG\nfig文件中的
    <add name=WindowsAuthentication type=SystemWebSecurityWindowsAuthenticationModule/>
    <add name=FormsAuthentication type=SystemWebSecurityFormsAuthenticationModule/>
    <add name=PassportAuthentication type=SystemWebSecurityPassportAuthenticationModule/>


From:http://tw.wingwit.com/Article/program/net/201311/12087.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.