我正在尝试在我的应用中设置身份验证。我发布到外部网站工作(脸书和谷歌)
[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();
}
如果我使用google登录,则以下内容将起作用 -
var userEmail = Request.Params[16];
但Facebook不会发回电子邮件。好吧,我无法在请求中看到它。必须有比使用Request.Params[16];
更好的方法
也。非常感谢帮助。
答案 0 :(得分:1)
无法看到OpenAuth
是什么,很难说新代码应该是什么样子。但足以说明你绝对不应该直接从请求中删除电子邮件地址。当您这样做时,OAuth和OpenID提供的所有安全性都毫无价值。您需要从正在使用的安全库中获取电子邮件地址。
对于Google,这意味着从响应的FetchResponse
或ClaimsResponse
扩展中获取它。
对于Facebook,这意味着使用从登录返回的访问令牌从Facebook 获取电子邮件地址,并验证受众群体字段,以确保访问令牌不会被重定向到您的网站用户欺骗攻击的一部分。