2015-09-04 104 views
1

我已经创建了一个应用程序与用户的asp.net mvc api,以下tutorial。 而且一切都很好。asp.net mvc API外部登录

现在我试图添加外部登录(实际上只是Facebook)。 我一直在寻找如何做到这一点,我发现了一个答案here

所以我配置了Startup.Auth.cs配置了Facebook AppId/Secret。

我做出GET api/Account/ExternalLogins?returnUrl=%2F&generateState=true

打个电话,然后我重定向到指定的URL。然后我回到像http://localhost:49728/#access_token= ... &token_type=bearer&expires_in=2592000&state= ...

这里是我的问题。接下来我应该怎么做才能在网站上注册用户。

Web应用程序完成后,会有一个移动本机应用程序。

编辑
我改变了返回URL,在那里我可以问,并保存用户名。 到目前为止不错。

后,我保存新的用户,我需要登录,所以我想这样的:

var state = new RegExp('[\&&]state=([^&#]*)').exec(window.location.href); 
       $.get(baseurl + 'api/Account/ExternalLogin?provider=Facebook&response_type=token&client_id=self&redirect_uri=' + encodeURIComponent(baseurl) + '&state=' + state[1], function (data, status) { 
        console.log(data); 
       }); 

,但我得到的400错误请求错误。
我现在的问题是我该如何解决这个问题,并进行登录?

回答

3

您需要承担由此产生的访问令牌,并用它来调用RegisterExternal网络电话,将其添加到授权头就像这样(使用邮递员来测试):

授权承载访问令牌这里

在注册外部网络电话时,您需要提供一封电子邮件,我想将它与Facebook登录关联。

,那么你需要重新做外部登录通话,你做的第一时间(链接来自何处获得外部登录)

这次返回的访问令牌将是本地访问令牌,而不是Facebook的外部访问令牌,这个令牌可以用来调用你的asp.net api,把它作为“授权”添加到http请求头中,就像我解释的一样。

编辑: 对您所尝试这种坏的请求: 去ApplicationOAuthProvider类,然后ValidateClientRedirectUri方法,更改方法代码:

if (context.ClientId == _publicClientId) 
{ 
    Uri expectedRootUri = new Uri(context.Request.Uri, "/"); 

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

return Task.FromResult<object>(null); 
+0

是的,差不多完成了,现在的问题是,当我尝试再次调用外部登录,GET/api/Account/ExternalLogin?provider = Facebook&response_type = token&client_id = self&redirect_uri = http%3A%2F%2Flocalhost%3A15359%2F&state = QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1'我得到400错误的错误请求。哪里不对? – BrunoRamalho

+0

我不确定你的问题是什么,我需要更多的代码和错误日志,如果你尝试使用邮递员,并且看到错误或调试以查看错误,那将会更有益处。然而,有些东西我想你试着让我知道它是否有效。我将编辑我的答案以添加更改。 – RaniDevpr

+0

它现在有效,忘记设置令牌 – BrunoRamalho