0

Umbraco Web サイトで実行されている .NET ユーザー コントロールがあり、コード ビハインドから現在のメンバーを削除できるようにしたいと考えています (それは素晴らしい計画のようには聞こえませんが、これは通常の ASP. NET Forms サイト) を呼び出しSystem.Web.Security.Membership.DeleteUser(usernameToDelete, trueOrFalse);ますが、呼び出すと (リダイレクト先のページで):

No member with username 'test10@test.test' exists
Exception Details: System.Configuration.Provider.ProviderException: No member with username 'test10@test.test' exists
[ProviderException: No member with username 'test10@test.test' exists]
   umbraco.providers.members.UmbracoProfileProvider.SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection) +346
   System.Configuration.SettingsBase.SaveCore() +402
   System.Configuration.SettingsBase.Save() +109
   System.Web.Profile.ProfileBase.SaveWithAssert() +31
   System.Web.Profile.ProfileBase.Save() +72
   System.Web.Profile.ProfileModule.OnLeave(Object source, EventArgs eventArgs) +9025062
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

ユーザーを削除してページを変更した後、プロパティ値を設定しようとするのはなぜですか? 現在の Umbraco メンバーを設定/削除する方法がわかりません。


編集: umbraco v 4.11.1 を使用しています (アセンブリ バージョン: 1.0.4715.27659)

これは、私が試したログアウトコードの最長バージョンであり、それでもエラーが発生します。

// sort out problems with umbraco caches:
Member.RemoveMemberFromCache(Member.CurrentMemberId());
Member.ClearMemberFromClient(Member.CurrentMemberId());

Roles.RemoveUserFromRole(Page.User.Identity.Name, JobShopRoles.RoleNames.Candidate.ToString());

//logout from: http://stackoverflow.com/questions/412300/formsauthentication-signout-does-not-log-the-user-out
FormsAuthentication.SignOut();
Page.Session.Clear();  // This may not be needed -- but can't hurt
Page.Session.Abandon();

// Clear authentication cookie
HttpCookie rFormsCookie = new HttpCookie(FormsAuthentication.FormsCookieName, "");
rFormsCookie.Expires = DateTime.Now.AddYears(-1);
Page.Response.Cookies.Add(rFormsCookie);

// Clear session cookie 
HttpCookie rSessionCookie = new HttpCookie("ASP.NET_SessionId", "");
rSessionCookie.Expires = DateTime.Now.AddYears(-1);
Page.Response.Cookies.Add(rSessionCookie);
// Invalidate the Cache on the Client Side

Page.Response.Cache.SetCacheability(HttpCacheability.NoCache);
Page.Response.Cache.SetNoStore();
//END logout

System.Web.Security.Membership.DeleteUser(currentUser.UserName, true);

//TODO: this will consistently give an error trying to update a property on a deleted member. Qs:
//http://stackoverflow.com/questions/14899945/error-trying-to-delete-current-member
//http://our.umbraco.org/forum/core/general/38455-Error-trying-to-delete-current-Member
Response.Redirect("/", false);
4

1 に答える 1

0

現在のユーザーを削除する前に分離コードからログアウトするとどうなりますか?

削除されたユーザーがまだログインしていて、現在のセッションに存在しているように見えるため、Umbraco profileprovider はそれに対して何かをしようとしています...

編集: FormsAuthentication ログアウト後にこれらの 2 つの方法を試して、役立つかどうかを確認します。

Member.RemoveMemberFromCache(Member.CurrentMemberId());
Member.ClearMemberFromClient(Member.CurrentMemberId());

編集2:

UmbracoProfileProvider クラスを調べて、エラーの原因を確認しました。

   public override void SetPropertyValues(SettingsContext context,
 SettingsPropertyValueCollection collection) {

                string username = (string)context["UserName"];
                bool authenticated = (bool)context["IsAuthenticated"];

                if (String.IsNullOrEmpty(username) || collection.Count == 0)
                    return;

                Member m = Member.GetMemberFromLoginName(username);
                if (m == null)
                    throw new ProviderException(String.Format("No member with username '{0}' exists", username));


                foreach (SettingsPropertyValue spv in collection) {
                    if (!authenticated && !(bool)spv.Property.Attributes["AllowAnonymous"])
                        continue;

                    if (m.getProperty(spv.Name) != null)
                        m.getProperty(spv.Name).Value = spv.PropertyValue;
                }

            }

プロバイダーがユーザー名に基づいて現在のメンバーを取得しようとすると、例外メッセージが表示されます。コンテキストに UserName がまだ含まれているか、SettingsPropertyValueCollection カウントが > 0 であるため、メンバーをログアウトするコードがまだ何かを残しているようです。

あなたが持っているすべてのログアウトコードの代わりに、この部分を試してください:

   Member.RemoveMemberFromCache(Member.CurrentMemberId());
   Member.ClearMemberFromClient(Member.CurrentMemberId());
   FormsAuthentication.SignOut();
   Roles.DeleteCookie();
   HttpContext.Current.Session.Clear();
   System.Web.Security.Membership.DeleteUser(usernameToDelete, false);

これにより、メンバーがキャッシュとクライアントから削除およびクリアされ、サインアウトされ、ロール Cookie が削除され、現在のセッションがクリアされます。最後に、ログアウトした後、ユーザー名を使用してメンバーを削除します。

于 2013-02-15T19:52:10.053 に答える