我想base64编码数据把它放在一个URL中,然后在我的HttpHandler中解码它.
我发现Base64编码允许使用'/'字符,这会弄乱我的UriTemplate匹配.然后我发现维基百科有一个"修改过的Base64 for URL"的概念:
存在修改的URL变体Base64,其中不使用填充'=',标准Base64的'+'和'/'字符分别替换为' - '和'_',因此使用URL编码器/解码器不再需要,并且对编码值的长度没有影响,保留相同的编码形式,以便在关系数据库,Web表单和对象标识符中使用.
使用.NET我想修改我当前的代码,从基本的base64编码和解码到使用"修改的base64 for URL"方法.有没有人这样做过?
为了解码,我知道它开头是这样的:
string base64EncodedText = base64UrlEncodedText.Replace('-', '+').Replace('_', '/');
// Append '=' char(s) if necessary - how best to do this?
// My normal base64 decoding now uses encodedText
Run Code Online (Sandbox Code Playgroud)
但是,我需要在结尾处添加一个或两个'='字符,这看起来有点复杂.
我的编码逻辑应该更简单一些:
// Perform normal base64 encoding
byte[] encodedBytes = Encoding.UTF8.GetBytes(unencodedText);
string base64EncodedText = Convert.ToBase64String(encodedBytes);
// Apply URL variant
string base64UrlEncodedText = base64EncodedText.Replace("=", String.Empty).Replace('+', '-').Replace('/', '_');
Run Code Online (Sandbox Code Playgroud)
我已经看到Guid to Base64用于URL StackOverflow条目,但是它具有已知长度,因此它们可以硬编码最后所需的等号数.
我正在看看asp.net mvc 4附带的默认OAuth实现.它绝对令人印象深刻,因为我所要做的就是在AuthConfig.cs中添加这一行:
OAuthWebSecurity.RegisterLinkedInClient("_key_", "_secret_");
Run Code Online (Sandbox Code Playgroud)
启用上面,确实提供了LinkedIn链接登录.我被提示输入密码一次,但进入后我得到了:
"登录失败.使用服务登录失败."
自从w/out再次被提示输入密码以来,它一直都是这样的.
我不清楚这是由于我输入的初始错误凭据,还是我设置密钥的方式.
此外,我在我的应用程序中的任何地方都看不到实际的控制器代码,所以即使我的登录工作,我也不清楚如何从链接中获取信息...即历史.
这种集成是多么容易,但是我倾向于更加手动实现这个?
但是我不禁想知道上面的实现可能也有效.
UPDATE
我已经跟踪了这个问题:
public ActionResult ExternalLogin(string provider, string returnUrl) {
return new ExternalLoginResult(provider, Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));
}
Run Code Online (Sandbox Code Playgroud)
即使凭据正确,回调也会以"401 Unauthorized"返回.从我可以在其他帖子中收集的内容,这可能是由于OAuth库错误地形成了标题?