2

我剛剛切換到.Net會員提供商來管理我的用戶。我有一個與Users表相關的表,名爲UserGroupDetails。我想在此表中添加一行,當Membership.CreateUser被調用。如果添加用戶失敗我想,以確保在UserGroupDetails記錄被刪除或不添加,如果添加記錄到UserGroupDetails失敗,我想Membership.CreateUser失敗,用戶不添加。會員CreateUser和相關表格

我不是在使用的SqlProfileProvider真正感興趣的,我還沒有發現有關重寫或修改Membership.CreateUser執行此附加刀片的任何信息。

是否有可能,如果有的話可以有人指出我是一個很好的資源如何做到這一點?

而且,我不希望重寫整個Membership.CreateUser方法。相反,我想簡單地添加到它。我看過http://msdn.microsoft.com/en-us/library/ms366730.aspx,但這似乎是重建車輪。

感謝, d

回答

1

創建一個繼承membershiprovider自定義提供。重寫create user方法以擴展功能。調用base.CreteUser,然後添加代碼以將其他記錄添加到自定義表中。

UPDATE:

這是你的自定義提供會是什麼樣

using System.Web.Security; 

namespace YourNameSpace 
{ 

    public class CustomSqlMembershipProvider : SqlMembershipProvider 
    { 

     public bool CreateUser(//list of parameters) 
     { 
      bool UserCreated = false; 
      MembershipCreateStatus status; 

      //provide the required parameters 
      base.CreateUser(//list of parameters); 

      if (status == 0)//user was successfully created 
      { 
       //perform your custom code 
       //if success 
       UserCreated = true; 
      } 

      return UserCreated 
     } 
    } 
} 

確保您引用新的自定義提供商在Web.config文件

<membership defaultProvider="CustomMembeshipProvider"> 
     <providers> 
     <clear/> 
     <add connectionStringName="Your connection string name" name="CustomMembeshipProvider" 
      type="YourNameSpace.CustomSqlMembershipProvider" /> 
     </providers> 
    </membership> 
+0

你是怎麼傳遞值來執行你的「自定義代碼」的?我正在採用這種方法,並有此查詢。 – Yasser

1

我已經做了這個!我首先創建我的aspnet用戶。這是我正在做的。

1)我已將此添加到我的web.config:

<system.web> 
     <membership> 
      <providers> 
       <clear/> 
       <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" 
        enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" 
        maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" 
        applicationName="[ApplicationName]" /> 
      </providers> 
     </membership> 
     <machineKey validationKey="[]" decryptionKey="[]" decryption="3DES" validation="SHA1" /> 
<connectionStrings> 
<add name="ApplicationServices" connectionString="Data Source=(local);Initial Catalog=[DataBaseName];User ID=[UserName];Password=Password" providerName="System.Data.SqlClient" /> 
</connectionStrings> 
</system.web> 

2)然後,我用它來創建我的用戶表

var user = Membership.CreateUser(request.UserName, request.Password, request.Email); 

3)最後,我搶我的ASPNET用戶ID我剛剛創建,在我的自定義用戶

user.ProviderUserKey.ToString(); 

涉及它你可以創建一些邏輯刪除ASPNET用戶如果INSERT INTO用戶GroupDetails失敗。

1

您不需要構建自定義提供程序。在調用CreateUser之後,只需添加代碼以連接UserGroupDetails表。

不幸的是,你不能用一個TransactionScope如果事情失敗,因爲CreateUsre會利用你的代碼一個單獨的數據庫連接回滾事務,而這將需要推動交易到distrivuted交易,這是一個痛苦的配置和設置。

最簡單的解決方案是檢查CreateUser是否失敗,如果失敗則不執行第二位代碼,如果第二位失敗則刪除創建的用戶。然而,這不是萬無一失的,因爲有些情況下你可能會有孤立的記錄。

爲了在單次交易中完成此操作,唯一的解決方案是自定義提供商,但我個人認爲這不值得。