2012-03-18 80 views
1

我发现描述了如何将现有的会员使用OpenID连接的文章,但是当用户使用某些OpenID提供商登录第一次我的应用程序,从他创建的帐户,它把自己的身份验证环节为用户名,和显示名称comment.How我在目前确定所要显示的用户名:会员用户名和DotNetOpenAuth

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 

我不知道它不会显示错误的用户,因为别人可以通过会员regeister用户名“富”和其他一些用户正在使用该用户名使用OpenID这样他会在他的评论字段中获得“Foo”

因此,要完成我的问题,将用户GUID放入路由网址会很糟糕,因为我在许多其他网站上看到类似的内容,或者有办法从GUID中派生整数来来回回?

回答

3

一个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()); 
    } 
+0

太感谢你了,正是我一直在寻找! – formatc 2012-03-19 09:06:17