Я не очень разбираюсь в OpenID, но вам в значительной степени нужно написать собственный сервис аутентификации, что не так уж и плохо. (кстати, он все еще будет использовать аутентификацию форм, что на самом деле удобно)
Если вы знаете, как проверить с помощью кода .....
На стороне сервера вам нужно три штуки. класс для хранения ваших пользовательских данных, класс, который наследует от auth форм .. и класс, который обрабатывает исключения при входе в систему ..
вот пример кода сервера (извините, за исключением проверки открытого идентификатора)
using System.ServiceModel.DomainServices.Server.ApplicationServices;
public class UserDTO : UserBase
{
public string Email { get; set; }
//Must be string since will be included in HTTP Headers
public string Id { get; set; }
public bool CanCreateSomething { get; set;}
}
с использованием Системы;
использование System.Data.Objects;
использование System.ServiceModel.DomainServices.Hosting;
[EnableClientAccess]
public class CustomAuthenticationService : FormsAuthenticationService<UserDTO>
{
protected override UserDTO ValidateCredentials(string name, string password, string customData,
out string userData)
{
UserDTO user = null;
userData = null;
OpenIDUser OIDusr;
if OIDusr != null)
{
user = new UserDTO { Name = OIDusr.Description, Email = OIDusr.PrimaryEmail, Id= OIDusr.Id.ToString() };
}
if (user != null)
{
//Set custom data fields for HTTP session
userData = user.PartyId + ":" + user.Email;
}
return user;
}
}
[Serializable]
public class FormsAuthenticationLogonException : Exception
{
public FormsAuthenticationLogonException(string message) : base(message){}
}
public abstract class FormsAuthenticationService<TUser> : DomainService, IAuthentication<TUser>
where TUser : UserBase
{
#region IAuthentication<TUser> Members
public TUser GetUser()
{
var currentUser = ServiceContext.User;
if ((currentUser != null) && currentUser.Identity.IsAuthenticated)
{
var userIdentity = currentUser.Identity as FormsIdentity;
if (userIdentity != null)
{
var ticket = userIdentity.Ticket;
if (ticket != null)
{
return GetCurrentUser(currentUser.Identity.Name, ticket.UserData);
}
}
}
return GetDefaultUser();
}
public TUser Login(string userName, string password, bool isPersistent, string customData)
{
string userData;
TUser user = ValidateCredentials(userName, password, customData, out userData);
if (user != null)
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( /* version */
1, userName, DateTime.Now, DateTime.Now.AddMinutes(30),
isPersistent, userData, FormsAuthentication.FormsCookiePath);
string encryptedTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
HttpContextBase httpContext = (HttpContextBase) ServiceContext.GetService(typeof (HttpContextBase));
httpContext.Response.Cookies.Add(authCookie);
}
else
{
HttpContextBase httpContext = (HttpContextBase) ServiceContext.GetService(typeof (HttpContextBase));
httpContext.AddError(new FormsAuthenticationLogonException("Username or password is not correct."));
}
return user;
}
public TUser Logout()
{
FormsAuthentication.SignOut();
return GetDefaultUser();
}
public void UpdateUser(TUser user)
{
throw new NotImplementedException();
}
#endregion
protected abstract TUser GetCurrentUser(string name, string userData);
protected virtual TUser GetDefaultUser()
{
return null;
}
protected abstract TUser ValidateCredentials(string name, string password, string customData,
out string userData);
}
На стороне клиента .....
LoginParameters loginParameters = new LoginParameters(UserName, Password);
WebContextBase.Current.Authentication.Login(loginParameters,
delegate(LoginOperation operation)
{
if (operation.HasError)
{
App.IsBusy = false;
operation.MarkErrorAsHandled();
UserName = string.Empty;
Password = string.Empty;
MessageBox.Show("Username or Password is incorrect!");
return;
}
//Login Success
CustomAuthenticationContext authContext = new CustomAuthenticationContext();
authContext.Load(authContext.GetUserQuery(), UserLoaded, false);
}, null);