1

我正在尝试在我的应用程序中设置身份验证。我有发布到外部网站的工作(脸书和谷歌)

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get), ValidateInput(false)]
    public ActionResult OpenIdLogOn(string returnUrl)
    {
        var redirectUrl = "~/Companies/LogIn";
        var provider = Request.Form["provider"];
        if (Common.IsNull(provider))
            return View();            
        OpenAuth.RequestAuthentication(provider, redirectUrl);
        return View();
    }

这通过确定单击了哪个按钮(使用 facebook / Google 登录)然后请求身份验证来工作。当身份验证完成并收到回复后,我尝试检索电子邮件地址。

public ActionResult LogIn()
    {
        var redirectUrl = "~/Companies/LogIn/OpenIdLogOn";
        var response = Response;
        var userEmail = Request.Params[16];
        if (!String.IsNullOrEmpty(ReturnUrl))
        {                
            Response.Redirect("~/Bloggers");
        }

        ViewBag.OAuthProviders = OpenAuth.AuthenticationClients.GetAll().ToList();
        return View();
    }

如果我使用谷歌登录,以下将起作用 -

var userEmail = Request.Params[16];

但facebook不会发回电子邮件。好吧,我在请求中看不到它。必须有比使用Request.Params[16]; 也更好的方法来做到这一点。帮助将不胜感激。

4

1 回答 1

1

如果看不到是什么OpenAuth,很难说新代码应该是什么样子。但是只要说你绝对不应该直接从请求中抓取电子邮件地址就足够了。当您这样做时,OAuth 和 OpenID 提供的所有安全性都毫无价值。您需要从您正在使用的安全库中获取电子邮件地址。

对于 Google,这意味着从响应的FetchResponseClaimsResponse扩展中获取它。

对于 Facebook,这意味着使用从登录返回的访问令牌从 Facebook 获取电子邮件地址验证受众字段,以确保访问令牌不会作为用户欺骗攻击的一部分被重定向到您的网站。

于 2013-02-03T14:47:34.667 回答