この質問もここに投稿しました:https://community.sitecore.net/developers/f/8/t/3681
こんにちは、みんな、
メールで検索するようにユーザー マネージャを変更しようとしています。Sitecore 7.1 を使用しています。RegEx を使用してメールをチェックするように UserProvider パイプラインを更新しました。検索語が電子メールの場合、メンバーはユーザー名ではなく電子メールで取得されます。
using Sitecore;
using Sitecore.Common;
using Sitecore.Configuration;
using Sitecore.Diagnostics;
using Sitecore.Security.Accounts;
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Web.Security;
namespace Configuration.SharedCNA.Pipelines
{
public class CustomUserProvider : UserProvider
{
public override IFilterable<User> GetUsers()
{
var users = new Filterable<User>(GetAllUsers, GetAllUsers, GetUserCount, GetUsersByName, GetUsersByNameCount);
return users;
}
protected override IEnumerable<User> GetUsersByName(int pageIndex, int pageSize, string userNameToMatch)
{
var users = FindUsers(pageIndex, pageSize, userNameToMatch);
return users;
}
private int GetUsersByNameCount(string userNameToMatch)
{
int totalRecords;
string userWithNoWildcard = StringUtil.RemovePostfix(Settings.Authentication.VirtualMembershipWildcard,
StringUtil.RemovePrefix(Settings.Authentication.VirtualMembershipWildcard, userNameToMatch));
if (Regex.IsMatch(userWithNoWildcard,
@"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$"))
Membership.FindUsersByEmail(userWithNoWildcard, 0, 1, out totalRecords);
else
Membership.FindUsersByName(userNameToMatch, 0, 1, out totalRecords);
return totalRecords;
}
protected IEnumerable<User> FindUsers(int pageIndex, int pageSize, string userNameToMatch)
{
Assert.ArgumentNotNull(userNameToMatch, "userNameToMatch");
IEnumerable<User> users;
string userWithNoWildcard = StringUtil.RemovePostfix(Settings.Authentication.VirtualMembershipWildcard,
StringUtil.RemovePrefix(Settings.Authentication.VirtualMembershipWildcard, userNameToMatch));
if (Regex.IsMatch(userWithNoWildcard,
@"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$"))
users = FindByEmail(pageIndex, pageSize, userWithNoWildcard);
else
users = FindByUsername(pageIndex, pageSize, userNameToMatch);
return users;
}
protected IEnumerable<User> FindByUsername(int pageIndex, int pageSize, string userNameToMatch)
{
Assert.ArgumentNotNull(userNameToMatch, "userNameToMatch");
int total;
return
new Enumerable<User>(
() => Membership.FindUsersByName(userNameToMatch, pageIndex, pageSize, out total).GetEnumerator(),
o => User.FromName(((MembershipUser)o).UserName, false));
}
protected IEnumerable<User> FindByEmail(int pageIndex, int pageSize, string userNameToMatch)
{
Assert.ArgumentNotNull(userNameToMatch, "userNameToMatch");
int total;
return
new Enumerable<User>(
() => Membership.FindUsersByEmail(userNameToMatch, pageIndex, pageSize, out total).GetEnumerator(),
o => User.FromName(((MembershipUser)o).UserName, false));
}
}
}
インスタンスごとにデバッガーにアタッチし、テスト ユーザーを検索しようとしました。そのアカウントに「test」という名前を付け、メールを「test.test@ttttt」に設定しました。検索をクリックした後、コードのブレークポイントがヒットし、ユーザーが返されることがわかりました! しかし、インターフェイスには何も表示されませんでした。ユーザー名と電子メールを「test.test@ttttt」に設定して別のアカウントを作成し、デバッガーを再度接続して、電子メールで再度検索するという別のシナリオを試しました。コードでは、2 人のユーザーが返されたことがわかりましたが、インターフェイスには、ユーザー名が "test.test@ttttt" に設定されたアカウントのみが表示されました。この問題を引き起こしている可能性のあるアイデアはありますか? Sitecore.Kernel および Sitecore.Client dll 内の UserManager および UserProvider とともに、UserManager.aspx ファイルを調査しようとしました。
ありがとう!
アルブラー