This blog post is archived. I consider it outdated and not very useful anymore but since there are many who still visit these pages I've decided to keep them up.
Openid login database schema
I’ve been working on a photo uploading website off and on for the past month or so - just a few hours a week (if that) and I was working on the Login portion and decided now would be a good time to get into OpenId. However, it’s not the most user friendly method of logging in. I wanted a way to use OpenId or a local login. In case people don’t want to use OpenId or just simply don’t know what it is. I plan on looking into Facebook Connect or Twitter auth, as well, and may post that how to integrate it in a future article.
To support OpenId and a local login I had to modify my table structure slightly. This will allow us to use only OpenId or local login should I decide to use one over the other. To accomplish this I moved the authentication portion of my User into a separate table.
public class User {
public int UserID { get; set; }
public string Name { get; set; }
public string Page { get; set; }
public virtual Authentication Authentication { get; set; }
}
public class Authentication {
public int Id { get; set; }
public string LoginId { get; set; }
public string OpenIdProvider { get; set; }
public string Password { get; set; }
public virtual User User { get; set; }
}
//login methods
User StandardUserLogin(string id) {
IDataContext db = new DataContext();
var user = db.Users.SingleOrDefault(u => u.Authentication.LoginId == username);
if (user != null) {
if (user.Authentication.Password == password) {
SetAuthenticationTicket(user);
return user;
}
}
}
User OpenIdUserLogin(string id) {
IDataContext db = new DataContext();
var user = db.Users.SingleOrDefault(u => u.Authentication.LoginId == username);
if (user == null) {
//create new openid user
}
if (user.Authentication.LoginId == id) {
SetAuthenticationTicket(user);
return user;
}
}
I actually do two different logins based on whether or not it’s an OpenId user. If it’s an OpenId User I automagically create a new user save it and return the new user (unless it has an existing login associated with it already)