会员用户名和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中来回推导整数?
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());
}