会员用户名和DotNetOpenAuth

本文关键字:DotNetOpenAuth 用户 | 更新日期: 2023-09-27 18:28:06

我发现一篇文章描述了如何将现有会员资格与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中来回推导整数?

会员用户名和DotNetOpenAuth

GUID当然可以放在URL中(可能没有大括号)。或者,作为128位数字,它也可以用base64字符串表示,该字符串比GUID短。任何一种都对用户非常不友好,但您对不同类型用户帐户之间冲突的担忧似乎是合理的。

以下是如何将GUID转换为base64网络安全字符串。代码片段由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();
    }

当然,从URL base64字符串转换回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());
    }