C# 发送HTTP标头后,DotNetOpenAuth授权无法设置状态?
我正在用异常填充elmah错误日志: 发送HTTP头后,服务器无法设置状态。 70%的请求是由爬虫程序(alexa、googlebot)引起的,我不能保证其余的请求不是带有假cookie、代理字符串等的机器人。但有些请求看起来确实合法 以下是发生错误的Facebook授权方法:C# 发送HTTP标头后,DotNetOpenAuth授权无法设置状态?,c#,asp.net-mvc,facebook,dotnetopenauth,C#,Asp.net Mvc,Facebook,Dotnetopenauth,我正在用异常填充elmah错误日志: 发送HTTP头后,服务器无法设置状态。 70%的请求是由爬虫程序(alexa、googlebot)引起的,我不能保证其余的请求不是带有假cookie、代理字符串等的机器人。但有些请求看起来确实合法 以下是发生错误的Facebook授权方法: public class FacebookClient : WebServerClient { private static readonly AuthorizationServerDesc
public class FacebookClient : WebServerClient
{
private static readonly AuthorizationServerDescription FacebookDescription = new AuthorizationServerDescription
{
TokenEndpoint = new Uri("https://graph.facebook.com/oauth/access_token"),
AuthorizationEndpoint = new Uri("https://graph.facebook.com/oauth/authorize"),
};
/// <summary>
/// Initializes a new instance of the <see cref="FacebookClient"/> class.
/// </summary>
public FacebookClient() : base(FacebookDescription)
{
}
}
[AllowAnonymous]
公共操作结果Facebook(字符串返回URL)
{
IAAuthorizationState authorization=client.ProcessUserAuthorization();
if(授权==null)
{
var scope=新列表();
范围。添加(“电子邮件”);
client.RequestUserAuthorization(范围);
}
其他的
{
尝试
{
var request=WebRequest.Create(“https://graph.facebook.com/me?&access_token=“+Uri.EscapeDataString(authorization.AccessToken));
使用(var response=request.GetResponse())
使用(var responseStream=response.GetResponseStream())
{
var-graph=FacebookGraph.Deserialize(responseStream);
if(Membership.GetUser(graph.Id.ToString())==null)
{
MembershipCreateStatus MembershipCreateStatus=MembershipCreateStatus.Success;
var user=Common.CreateUser(membershipCreateStatus,graph.Id.ToString(),HttpUtility.HtmlEncode(graph.Email));
if(membershipCreateStatus!=membershipCreateStatus.Success)
{
TempData[“message”]=“创建帐户失败。”+membershipCreateStatus.ToString();
返回重定向操作(“登录”、“帐户”);
}
if(membershipCreateStatus==membershipCreateStatus.Success)
{
AddUserShortID((Guid)user.ProviderUserKey,HttpUtility.HtmlEncode(graph.Name));
Common.Authorize(graph.Id.ToString());
}
}
其他的
{
Common.Authorize(graph.Id.ToString());
}
}
}
抓住
{
TempData[“message”]=“创建帐户失败。”;
返回重定向操作(“登录”、“帐户”);
}
}
if(!string.IsNullOrWhiteSpace(returnUrl)和&Url.islocalur(returnUrl))
{
返回重定向(returnUrl);
}
返回重定向到操作(“索引”、“主页”);
}
代码中最可疑的部分是什么,可能导致这种行为?为什么这种情况大部分时间都发生在机器人身上?有没有办法复制这样的东西
更新:这不仅仅是机器人造成的,我昨天也遇到了这个异常,只是在日志中,在浏览器中我找不到graph.facebook.com/…我发现了这个异常发生的时间,当我被重定向到facebook登录页面时,如果你刷新页面或输入登录信息错误,或者,如果由于任何原因该页面当前不可用,则会记录此异常,但最重要的是,用户不会看到任何异常情况发生,也不会在登录时遇到任何问题。
private static readonly FacebookClient client = new FacebookClient
{
ClientIdentifier = ConfigurationManager.AppSettings["facebookAppID"],
ClientCredentialApplicator = ClientCredentialApplicator.PostParameter(ConfigurationManager.AppSettings["facebookAppSecret"]),
};
[AllowAnonymous]
public ActionResult Facebook(string returnUrl)
{
IAuthorizationState authorization = client.ProcessUserAuthorization();
if (authorization == null)
{
var scope = new List<string>();
scope.Add("email");
client.RequestUserAuthorization(scope);
}
else
{
try
{
var request = WebRequest.Create("https://graph.facebook.com/me?&access_token=" + Uri.EscapeDataString(authorization.AccessToken));
using (var response = request.GetResponse())
using (var responseStream = response.GetResponseStream())
{
var graph = FacebookGraph.Deserialize(responseStream);
if (Membership.GetUser(graph.Id.ToString()) == null)
{
MembershipCreateStatus membershipCreateStatus = MembershipCreateStatus.Success;
var user = Common.CreateUser(membershipCreateStatus, graph.Id.ToString(), HttpUtility.HtmlEncode(graph.Email));
if (membershipCreateStatus != MembershipCreateStatus.Success)
{
TempData["message"] = "Unsuccessful creation of Account. " + membershipCreateStatus.ToString();
return RedirectToAction("Login", "Account");
}
if (membershipCreateStatus == MembershipCreateStatus.Success)
{
AddUserShortID((Guid)user.ProviderUserKey, HttpUtility.HtmlEncode(graph.Name));
Common.Authorize(graph.Id.ToString());
}
}
else
{
Common.Authorize(graph.Id.ToString());
}
}
}
catch
{
TempData["message"] = "Unsuccessful creation of Account. ";
return RedirectToAction("Login", "Account");
}
}
if (!string.IsNullOrWhiteSpace(returnUrl) && Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
return RedirectToAction("Index", "Home");
}