Имена пользователей и DotNetOpenAuth - PullRequest
1 голос
/ 18 марта 2012

Я нашел статью, описывающую, как связать существующее членство с OpenID, но когда пользователь использует какой-либо провайдер OpenID для входа в систему, когда мое приложение создает из него учетную запись, он ставит свою ссылку для аутентификации в качестве имени пользователя и отображает имя в качестве комментария. Как я могув настоящее время определяется, что отображать как имя пользователя:

string username = Membership.GetUser(UserID).UserName;

            return string.IsNullOrEmpty(Membership.GetUser(UserID).Comment) ? username : Membership.GetUser(username).Comment;

Это действительно не проблема, но теперь я должен как-то ссылаться на страницу профиля пользователя, и я не уверен, как это сделать, вотпример того, что может работать для меня:

www.example.com/users/Guid/DisplayName

Отображаемое имя - это либо имя пользователя, если он зарегистрировался на моей странице, либо комментарий, если пользователь использовал провайдера OpenID, создает учетную запись.

, если я сделал что-то подобное:

 www.example.com/users/DisplayName

Я не уверен, что он не отобразит неправильного пользователя, так как кто-то может повторно зарегистрировать имя пользователя "Foo" через членство, и какой-то другой пользователь использует это имя пользователя с OpenID, поэтому он получит "Foo" вего поле комментария

Итак, чтобы закончить мой вопрос, было бы плохо поместить GUID пользователя в перенаправленный URL, поскольку я видел подобные вещи на человекеу других сайтов, или есть способ получить целое число из GUID туда и обратно?

1 Ответ

3 голосов
/ 19 марта 2012

GUID, безусловно, может быть вставлен в URL (возможно, без фигурных скобок вокруг него).Альтернативно, как 128-битное число, оно также может быть представлено в строке base64, которая будет короче, чем GUID.Любой из них довольно неудобен для пользователей, но ваша обеспокоенность коллизиями между различными типами учетных записей пользователей кажется оправданной.

Вот как вы можете преобразовать GUID в строку base64-safe-web.Фрагменты кода любезно предоставлены DotNetOpenAuth утилитами).

Guid userGuid; // value comes from your database
ConvertToBase64WebSafeString(userGuid.ToByteArray());


    /// <summary>
    /// Converts to data buffer to a base64-encoded string, using web safe characters and with the padding removed.
    /// </summary>
    /// <param name="data">The data buffer.</param>
    /// <returns>A web-safe base64-encoded string without padding.</returns>
    internal static string ConvertToBase64WebSafeString(byte[] data) {
        var builder = new StringBuilder(Convert.ToBase64String(data));

        // Swap out the URL-unsafe characters, and trim the padding characters.
        builder.Replace('+', '-').Replace('/', '_');
        while (builder[builder.Length - 1] == '=') { // should happen at most twice.
            builder.Length -= 1;
        }

        return builder.ToString();
    }

И, конечно, конвертировать обратно из строки base64 URL в Guid:

string base64SegmentFromUrl; // from incoming web request to profile page
Guid userGuid = new Guid(FromBase64WebSafeString(base64SegmentFromUrl);

    /// <summary>
    /// Decodes a (web-safe) base64-string back to its binary buffer form.
    /// </summary>
    /// <param name="base64WebSafe">The base64-encoded string.  May be web-safe encoded.</param>
    /// <returns>A data buffer.</returns>
    internal static byte[] FromBase64WebSafeString(string base64WebSafe) {
        Requires.NotNullOrEmpty(base64WebSafe, "base64WebSafe");
        Contract.Ensures(Contract.Result<byte[]>() != null);

        // Restore the padding characters and original URL-unsafe characters.
        int missingPaddingCharacters;
        switch (base64WebSafe.Length % 4) {
            case 3:
                missingPaddingCharacters = 1;
                break;
            case 2:
                missingPaddingCharacters = 2;
                break;
            case 0:
                missingPaddingCharacters = 0;
                break;
            default:
                throw ErrorUtilities.ThrowInternal("No more than two padding characters should be present for base64.");
        }
        var builder = new StringBuilder(base64WebSafe, base64WebSafe.Length + missingPaddingCharacters);
        builder.Replace('-', '+').Replace('_', '/');
        builder.Append('=', missingPaddingCharacters);

        return Convert.FromBase64String(builder.ToString());
    }
...