使用Salesforce的MVC OAuth身份验证返回登录页面

Ell*_*dil 10 c# asp.net-mvc salesforce oauth-2.0 asp.net-mvc-5

我正在尝试使用其OAuth身份验证工作流程来获取针对Salesforce在.NET中验证MVC应用程序的实例.我一直在参考这个非常简单的演练.这与让Google身份验证工作非常相似.它归结为使用个人帐户身份验证模板设置.NET MVC项目,并在Salesforce中启动新的连接应用程序.然后,添加Owin.Security.Providers库的Salesforce,调整Startup.Auth.cs了一下,包括ClientIdClientSecret从Salesforce的应用程序,授权和令牌端点.它建议的回调网址是http:// localhost:[port]/signin-salesforce,这与用于Google身份验证的回调网址非常相似.

当我被重定向到Salesforce并且可以登录时,将我返回到我的MVC应用程序的握手似乎遇到了一个我无法确定的问题.我被重定向回登录页面,.NET似乎并不知道我的登录信息,虽然我肯定有一个与Salesforce的活动会话(Salesforce仪表板将自动登录我).在代码中,事情开始在这里横行:

// GET: /Account/ExternalLoginCallback
[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
    var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
    if (loginInfo == null)
    {
        return RedirectToAction("Login");
    }
    //more code we never reach
}
Run Code Online (Sandbox Code Playgroud)

loginInfo永远是空的.因此,为了弄清楚将什么类型的请求发送到.NET,我转向Fiddler并遇到一个请求反对localhost:[port]/signin-salesforce一堆参数得到一个奇怪的响应:

找到HTTP/1.1 302

位置:/ Account/ExternalLoginCallback?error = access_denied

服务器:Microsoft-IIS/10.0

Set-Cookie:.AspNet.Correlation.Salesforce =; 路径= /; expires =周四,01-Jan-1970 00:00:00 GMT

X-SourceFiles:????= UTF-8乙YzpcdXNlcnNcc3RldmUuY2FtaXJlXGRvY3VtZW50c1x2aXN1YWwgc3R1ZGlvIDIwMTVcUHJvamVjdHNcU2FsZXNGb3JjZUludGVncmF0aW9uXFNhbGVzRm9yY2VJbnRlZ3JhdGlvblxzaWduaW4tc2FsZXNmb3JjZQ == =

X-Powered-By:ASP.NET

日期:2016年5月20日星期五21:46:09 GMT

内容长度:0

请注意Location标头,它告诉.NET重定向到/Account/ExternalLoginCallback错误参数"access_denied".启用一些跟踪Owin显示某些东西在.NET或.NET中返回400,但我不知道是什么.

所以,那就是我所处的位置.一个null在我的控制器和证据LOGININFO对象的东西是在一些Web请求去错了.我已经仔细阅读了其他几个相关问题,但几乎没有人专注于SalesForce,他们提供的答案并不真正适用(例如,我没有启用Google+ API).关于如何纠正这个问题的任何想法?

小智 1

对于每个遇到登录信息问题的人,当它确实不应该返回 null 时,这可能无法解决您的问题,但是我花了几天时间解决 facebook 和 google 的类似问题。我最终在调用ExternalLoginCallback 之前清除了HttpContext 会话,从那时起它就一直工作得很好。并不是说这会解决它,但希望它对某人有所帮助。

//
// POST: /Account/ExternalLogin
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ExternalLogin(string provider, string returnUrl)
{
    // Clear any other session first as this seems to cause unexpected null responses.
    if (ControllerContext.HttpContext.Session != null)
    {
        ControllerContext.HttpContext.Session.RemoveAll();
    }

    // Request a redirect to the external login provider
    return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
}
Run Code Online (Sandbox Code Playgroud)

当我测试我的时,我与 Fiddler 进行了检查,我得到了一个令牌,好的,如果你没有得到有效的响应,那么这将无济于事。