私は OpenID についてあまり知りませんが、カスタムの認証サービスを作成する必要があり、それほど悪くはありません。(ちなみに、実際には便利なフォーム認証を引き続き利用します)
コードを介して検証する方法を知っている場合.....
サーバー側では、3 つの部分が必要です。ユーザー データを保持するクラス、フォーム認証から継承するクラス、およびログオン例外を処理するクラス..
これはサーバーコードの例です(申し訳ありませんが、オープンIDチェックを差し引いています)
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);