所以我是C#的新手,我不知道我看到的是不是明显的有意为之的行为,或者我正在使用的对象是否有一些细微差别. 我正在try 设置一个服务器来处理StackOverflow应用程序的OAuth流的重定向.构建的重定向URL看起来像localhost:8080/#access_token=12345.

我基本上将以下内容设置为我的简单服务器,以处理重定向请求并保存access_token.

public class ImplicitFlowHttpServer
{
    public int Port = 8080;
    private HttpListener _listener;

    public void Start()
    {
        var prefix = $"http://*:8080/";
        _listener = new HttpListener();
        _listener.Prefixes.Add(prefix);
        _listener.Start();
        _listener.BeginGetContext(new AsyncCallback(ListenerCallback), _listener);
    }

    private async void ListenerCallback(IAsyncResult result)
    {
        if (_listener.IsListening)
        {
            string oauthCode;
            var context = _listener.EndGetContext(result);
            var request = context.Request;
            
            // code to send response, not relevant to my question
            HttpListenerResponse response = context.Response;
            byte[] page = Encoding.ASCII.GetBytes(
                "You can close this browser tab now.");

            response.ContentLength64 = page.Length;
            Stream output = response.OutputStream;
            output.Write(page, 0, page.Length);
            output.Close();

            //
            
            Console.WriteLine($"Should receive a request to localhost:8080/#access_token=<token>");
            Console.WriteLine($"How can I see the access_token?");
            Console.WriteLine($"request.Url: {request.Url}");
            Console.WriteLine($"request.Url.Fragment: {request.Url.Fragment}");
            Console.WriteLine($"request.RawUrl: {request.RawUrl}");
            Console.WriteLine($"request.Url.AbsoluteUri: {request.Url.AbsoluteUri}");
            Console.WriteLine($"request.Url.OriginalString: {request.Url.OriginalString}");

            // <here is code to parse the access_token if it existed>
            // <here is code to stop the server>
        }
    }
}

你可以看到,我期待的是request对象中的某个地方的散列,#access_token会存在,我只需要弄清楚如何将其取出,但我认为它已经完全被清除了. 这与重定向无关,因为如果我启动服务器然后执行curl "localhost:8080/?q=123&hello=world\#access_token=123456",我也会遇到同样的问题 有了上面的代码,我将看到

request.Url: http://localhost:8080/?q=123&hello=world%5C
request.Url.Fragment:
request.RawUrl: /?q=123&hello=world\
request.Url.AbsoluteUri: http://localhost:8080/?q=123&hello=world%5C
request.Url.OriginalString: http://localhost:8080/?q=123&hello=world%5C

因此,鉴于我被这个访问令牌"in the hash"困住了,我应该如何从那个重定向中获得access_token呢?

推荐答案

Url的片段部分(#之后的部分)是特殊的,因为它只供客户端使用.当向服务器发送请求时,代理(Web浏览器、cURL等)将从URL中删除片段部分.因此,它的工作方式与预期一致.

这也是为什么在此OAuth流中以这种方式传递令牌的原因--因此,当发生重定向时,令牌不能由服务器访问,而只能由客户端访问.

至于如何在您的 case 中解决此问题,请注意您的链接上的文档如何说明:

显式流应由服务器端应用程序使用, 特别注意,决不泄露客户机密.客户端 应用程序应该使用隐式流.

您正在使用隐式流.如果您将使用显式流,则令牌将可由您的服务器访问.

Csharp相关问答推荐

O(N)测试失败

将委托传递到serviceccollection c#web API

System. InvalidOperationException:无法将数据库中的字符串值i转换为映射的ItemType枚举中的任何值''''

使用LINQ to XML获取元素值列表是不起作用的

如何在Visual Studio代码中更改大括号模式{},用于C#语言

使用Audit.EntityFramework,我如何将外键的值设置为相关实体上的属性?

内部接口和类的DI解析

如何在C#中从正则表达式中匹配一些数字但排除一些常量(也是数字)

从.Net 6 DLL注册和检索COM对象(Typelib导出:类型库未注册.(异常来自HRESULT:0x80131165))

如何通过寻找向量长度来优化两个循环?

如何让NLog停止写入冗余信息?

使用Entity Framework6在对象中填充列表会导致列表大多为空

带有可选参数的模拟方法返回意外的不同值,具体取决于可选的默认值

C#自定义验证属性未触发IsValid方法

WPF DataGrid文件名列,允许直接输入文本或通过对话框按键浏览

如何在绑定到数据库的datagridview中向上或向下移动行

有没有更好的方法来使用LINQ获取整行的计算组

我什么时候不应该在Dispose中调用EgSuppressFinalize(This)?

能否将我图表中的星号与X轴上一天中的第二位数字对齐?

如何在列表框中显示UserControl对象?