我正在实现DotNetOpenAuth (OpenID)和Forms身份验证,作为我正在构建的站点的身份验证机制。然而,我对我想出的部分解决方案并不满意,尽管我应该向你们检查一下通常是如何做到的。
我已经将窗体身份验证loginUrl设置为login.aspx。这是登录页面背后的代码:
public partial class Login : DataAccessPage {
protected void Page_Load(object sender, EventArgs e) {
if (Request.QueryString["dnoa.receiver"] != "openId") {
openId.ReturnToUrl = Request.Url.ToString();
openId.LogOn();
}
}
protected void openId_LoggedIn(object sender, DotNetOpenAuth.OpenId.RelyingParty.OpenIdEventArgs e) {
var fetch = e.Response.GetExtension();
if (fetch != null) {
string eMail = fetch.GetAttributeValue(WellKnownAttributes.Contact.Email);
string name = fetch.GetAttributeValue(WellKnownAttributes.Name.FullName);
var usr = db.Users.SingleOrDefault(u => u.EMailAddress == eMail);
if (usr != null) {
// update the name in db if it has been changed on Google
if (usr.Name != name) {
usr.Name = name;
db.SaveChanges();
}
FormsAuthentication.RedirectFromLoginPage(usr.UserId.ToString(), false);
}
}
}
protected void openId_LoggingIn(object sender, DotNetOpenAuth.OpenId.RelyingParty.OpenIdEventArgs e) {
var fetch = new FetchRequest();
fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
fetch.Attributes.AddRequired(WellKnownAttributes.Name.FullName);
e.Request.AddExtension(fetch);
}
}因此,当用户未登录时,直接将其发送到Login.aspx页面,后者直接尝试使用OpenID对Google进行登录。它检查用户是否在允许的用户列表中,然后检查FormsAuthentication.RedirectFromLoginPage()。
到目前为止没问题..。这个问题是在注册时发生的。理想情况下,我希望登录是直接连接到谷歌帐户签名的状态。如果用户登录到谷歌,他/她也应该在我的网站注册。当用户从Google登录时,他/她应该从我的站点被注销。但是,由于使用了表单身份验证,即使用户退出Google.,票证也会持续一段时间。
有人想办法解决这个问题吗?
提前感谢!
发布于 2010-10-19 00:49:04
首先,回答您的问题: OpenID没有提供一种将Google的长度与您自己的会话联系起来的方法。你能做的最好就是提供一个只会话(非持久性)的cookie,就像你已经在做的那样,这样如果用户从Google登录并关闭他们的浏览器,他们也会被从你的站点中注销。这是一个OpenID协议限制--没有其他OpenID库能够修复它。
关于你没有要求的问题,但我不能忽视它--你的实现是相当不安全的。您正隐式地信任AX fetch响应扩展,允许它声称用户控件的任何电子邮件地址都是登录的用户。这意味着任何人都可以设置一个关于电子邮件地址和伪造用户身份的OpenID提供者。您可能错误地假设,仅仅因为您将用户重定向到Google,这就意味着所有的响应都来自Google (并且假设您信任Google)。仅仅因为你向Google发送了一个请求,并不意味着某人不能合成来自他们自己的非Google服务器的响应。
有两种方法可以解决您的安全问题。首先(最好)不要使用电子邮件地址作为你的用户名。使用IAuthenticationResponse.ClaimedIdentifier作为用户名。这就是它的目的,并将保护你免受许多不同的攻击。较不可取的解决办法是继续使用电子邮件,但在您信任该电子邮件之前,要验证该回复实际上来自Google。您可以通过IAuthenticationResponse.Provider.Uri属性进行此操作,并验证它是否是您所期望和信任的属性。
https://stackoverflow.com/questions/3954152
复制相似问题