Search code examples
authenticationsilverlight-4.0forms-authenticationria

Custom authentication domain service - Silverlight and RIA


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


Solution

  • Make sure you are using the correct namespaces.

    I noticed two small typos in the code that you pasted:

    1. if(name=="John" && password = "123")
      Should be:
      if (name=="John" && password == "123")

    2. retrurn user;
      Should be:
      return user;

    Otherwise, it compiles without errors for me.

    1. Create a new Web Application

    2. 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")

    3. 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")

    4. 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;
              }
          }
      }