ASP.NET Web API 2 Facebook 登录

5
我正在尝试通过Facebook验证用户的Web API。当我将returnurl参数指定到网站的基础时,我能够验证用户。
我的测试环境中,我的网站布局如下: http://subdomain.main.com/api/ - 这是API位置 http://subdomain.main.com/web/ - 这是客户端网站位置
我通过API获取提供者列表,并返回以下JSON。
[{"Name":"Facebook","Url":"/api/api/Account/ExternalLogin?
provider=Facebook&response_type=token&
client_id=self&redirect_uri=https%3A%2F%2Fsubdomain.main.com%2F&state=mScYbSFDVHMMxVH8kaNWmDUNhqo2s4RFbG9SaBXt_jM1","State":"mScYbSFDVHMMxVH8kaNWmDUNhqo2s4RFbG9SaBXt_jM1"}]

我会尽力为您翻译。这段内容是关于编程的,其中包含HTML标签。它的意思是:“我将用户重定向到API提供的URL。这会打开Facebook并要求用户允许我的应用程序。”
“当我使用基本URL时,一切都正常运作,但当我将returnurl更改为以下内容时:”

https://subdomain.main.com/api/api/Account/ExternalLogins?returnUrl=https://subdomain.main.com/web/&generateState=true

该API正常情况下返回一个URL,但当我尝试将用户重定向到提供的URL时,它只会返回错误:“error: invalid_request”。我该如何让API重定向到我的网站,以便我可以捕获OAuth令牌?
1个回答

6

您需要编辑ValidateClientRedirectUri方法以包括您的自定义返回URI。默认模板代码仅允许您网站的根目录作为有效的返回URI。

下面的示例是一个快速的hack,直到您决定确切的返回URI。

public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
    {
        if (context.ClientId == _publicClientId)
        {
            Uri expectedRootUri = new Uri(context.Request.Uri, "/");

            if (expectedRootUri.AbsoluteUri == context.RedirectUri)
            {
                context.Validated();
            }
        }

        return Task.FromResult<object>(null);
    }

to

public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
    {
        if (context.ClientId == _publicClientId)
        {
            context.Validated();
        }

        return Task.FromResult<object>(null);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接