I'm trying to write custom authentication domain service. I think I understood all code which was written on this blog.
However I don't know how to specify which domain service application should use. I have one abstract domain service and second one is a concrete implementation of this service. If I build entire solution I get an error
'MainModule.Web.FormsAuthenticationService`1' is not a valid DomainService type. DomainService types cannot be abstract or generic.
I didn't find source code on blog which I mentioned before.
namespace MainModule.Web
{
using System;
using System.ServiceModel.DomainServices.Hosting;
using System.ServiceModel.DomainServices.Server;
// TODO: Create methods containing your application logic.
[EnableClientAccess()]
public abstract class FormsAuthenticationService<TUser> : DomainService, IAuthentication<TUser> where TUser : UserBase
{
protected abstract TUser GetCurrentUser(string name, string userData);
protected abstract TUser ValidateCredentials(string name, string password, string customData, out string userData);
protected virtual TUser GetDefaultUser()
{
return null;
}
public TUser GetUser()
{
IPrincipal currentUser = ServiceContext.User;
if ((currentUser != null) && currentUser.Identity.IsAuthenticated)
{
FormsIdentity userIdentity = currentUser.Identity as FormsIdentity;
if (userIdentity != null)
{
FormsAuthenticationTicket 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();
}
}
}
namespace MainModule.Web
{
using System.ServiceModel.DomainServices.Hosting;
// TODO: Create methods containing your application logic.
[EnableClientAccess()]
public class CustomAuthenticationService :FormsAuthenticationService<UserDTO>
{
protected override UserDTO GetCurrentUser(string name, string userData)
{
return new UserDTO {DisplayName = name, Name = name};
}
protected override UserDTO ValidateCredentials(string name, string password, string customData, out string userData)
{
userData = null;
UserDTO user = null;
if(name=="John" && password = "123")
{
userData = name;
user = new UserDTO {DisplayName = name, Email = "asdf"};
}
retrurn user;
}
}
}
This are classes I implemeted - it's the same code which is posted on blog. There is no exception so I can't paste an stackTrace. I just can't compile the solution
Make sure you are using the correct namespaces.
I noticed two small typos in the code that you pasted:
if(name=="John" && password = "123")
Should be:
if (name=="John" && password == "123")
retrurn user;
Should be:
return user;
Otherwise, it compiles without errors for me.
Create a new Web Application
Add a reference to System.ServiceModel.DomainServices.Hosting
(ex. from "C:\Program Files (x86)\Microsoft SDKs\RIA Services\v1.0\Libraries\Server\System.ServiceModel.DomainServices.Hosting.dll")
Add a reference to System.ServiceModel.DomainServices.Server
(ex. from "C:\Program Files (x86)\Microsoft SDKs\RIA Services\v1.0\Libraries\Server\System.ServiceModel.DomainServices.Server.dll")
Create a class called CustomAuthenticationService
and insert the code below.
using System.ServiceModel.DomainServices.Hosting;
using System.Web;
using System.Web.Security;
using System;
using System.Security.Principal;
using System.ServiceModel.DomainServices.Server;
using System.ServiceModel.DomainServices.Server.ApplicationServices;
namespace WebApplication1.Services
{
public class UserDTO : UserBase
{
public string DisplayName { get; set; }
public string Email { get; set; }
}
public class FormsAuthenticationLogonException : System.Exception
{
public FormsAuthenticationLogonException(string message) : base(message) { }
}
// TODO: Create methods containing your application logic.
[EnableClientAccess()]
public abstract class FormsAuthenticationService<TUser> : DomainService, IAuthentication<TUser> where TUser : UserBase
{
protected abstract TUser GetCurrentUser(string name, string userData);
protected abstract TUser ValidateCredentials(string name, string password, string customData, out string userData);
protected virtual TUser GetDefaultUser()
{
return null;
}
public TUser GetUser()
{
IPrincipal currentUser = ServiceContext.User;
if ((currentUser != null) && currentUser.Identity.IsAuthenticated)
{
FormsIdentity userIdentity = currentUser.Identity as FormsIdentity;
if (userIdentity != null)
{
FormsAuthenticationTicket 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();
}
}
// TODO: Create methods containing your application logic.
[EnableClientAccess()]
public class CustomAuthenticationService : FormsAuthenticationService<UserDTO>
{
protected override UserDTO GetCurrentUser(string name, string userData)
{
return new UserDTO { DisplayName = name, Name = name };
}
protected override UserDTO ValidateCredentials(string name, string password, string customData, out string userData)
{
userData = null;
UserDTO user = null;
if (name == "John" && password == "123")
{
userData = name;
user = new UserDTO { DisplayName = name, Email = "asdf" };
}
return user;
}
}
}