2

この質問もここに投稿しました: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 ファイルを調査しようとしました。

ありがとう!

アルブラー

4

0 に答える 0