view Agendas/trunk/src/Agendas.Web/Controllers/AccountController.cs @ 94:db4b1e2cae49

Cambio del nombre de la clase Ponente a Persona Se agrega la clase Cuenta para identificar cada una de las cuentas con que se puede autenticar una persona Alta Automatica de cuentas de twitter creando la persona
author Nelo@Kenia.neluz.int
date Sat, 04 Jun 2011 12:11:17 -0300
parents 65f0b3d70c18
children 1eb5a0e531bf
line wrap: on
line source

using System;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using AltNetHispano.Agendas.Domain;
using AltNetHispano.Agendas.Factories;
using AltNetHispano.Agendas.Twitter;
using AltNetHispano.Agendas.Web.Models;
using AltNetHispano.Agendas.Web.Services;

namespace AltNetHispano.Agendas.Web.Controllers
{
    public class AccountController : Controller
    {

        public IFormsAuthenticationService FormsService { get; set; }
        public IMembershipService MembershipService { get; set; }

        protected override void Initialize(RequestContext requestContext)
        {
            if (FormsService == null) { FormsService = new FormsAuthenticationService(); }
            if (MembershipService == null) { MembershipService = new AccountMembershipService(); }

            base.Initialize(requestContext);
        }

        // **************************************
        // URL: /Account/LogOn
        // **************************************

        public ActionResult LogOn()
        {
            return View();
        }

        [HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (MembershipService.ValidateUser(model.UserName, model.Password))
                {
                    FormsService.SignIn(model.UserName, model.RememberMe);
                    if (Url.IsLocalUrl(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "The user name or password provided is incorrect.");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

		public ActionResult TwitterLogOn()
		{
			var oAuth = new OAuthTwitter();

			if (Request["oauth_token"] == null)
			{
				//Redirect the user to Twitter for authorization.
				//Using oauth_callback for local testing.
				var action = Url.Action("TwitterLogOn");
				var url = Request.Url.Scheme + "://" + Request.Url.Host +
				          (Request.Url.Port != 80 ? ":" + Request.Url.Port : string.Empty) + action;

				oAuth.CallBackUrl = url;
				Response.Redirect(oAuth.AuthorizationLinkGet());
			}
			else
			{
				//Get the access token and secret.
				oAuth.AccessTokenGet(Request["oauth_token"], Request["oauth_verifier"]);
				if (oAuth.TokenSecret.Length > 0)
				{
					//We now have the credentials, so make a call to the Twitter API.
					const string url = "http://twitter.com/account/verify_credentials.xml";
					string xml = oAuth.OAuthWebRequest(OAuthTwitter.Method.GET, url, String.Empty);

					var username = GetXmlContent(xml, "screen_name");
					var nombre = GetXmlContent(xml, "name");

					var personaService = AgendaFactory.GetPersonaService();
					if (personaService.Validate(IdentityProviderEnum.Twitter, username, nombre))
					{
						FormsService.SignIn(username, false);
						return RedirectToAction("Index", "Home");
					}
					ModelState.AddModelError("", "The user name or password provided is incorrect.");


					//POST Test
					//url = "http://twitter.com/statuses/update.xml";
					//xml = oAuth.oAuthWebRequest(oAuthTwitter.Method.POST, url, "status=" + oAuth.UrlEncode("Hello @swhitley - Testing the .NET oAuth API"));
					//apiResponse.InnerHtml = Server.HtmlEncode(xml);
				}
			}

			return RedirectToAction("LogOn");
		}

    	private static string GetXmlContent(string xml, string tagName)
    	{
    		var tagStart = "<" + tagName + ">";
    		var tagEnd = "</" + tagName + ">";

    		var start = xml.IndexOf(tagStart)+tagStart.Length;
			if (start>tagStart.Length)
			{
				var end = xml.IndexOf(tagEnd, start);
				if (end>0)
				{
					return xml.Substring(start, end - start);
				}
			}
    		return string.Empty;
    	}

    	// **************************************
        // URL: /Account/LogOff
        // **************************************

        public ActionResult LogOff()
        {
            FormsService.SignOut();

            return RedirectToAction("Index", "Home");
        }

        // **************************************
        // URL: /Account/Register
        // **************************************

        public ActionResult Register()
        {
            ViewBag.PasswordLength = MembershipService.MinPasswordLength;
            return View();
        }

        [HttpPost]
        public ActionResult Register(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
                // Attempt to register the user
                MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Password, model.Email);

                if (createStatus == MembershipCreateStatus.Success)
                {
                    FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus));
                }
            }

            // If we got this far, something failed, redisplay form
            ViewBag.PasswordLength = MembershipService.MinPasswordLength;
            return View(model);
        }

        // **************************************
        // URL: /Account/ChangePassword
        // **************************************

        [Authorize]
        public ActionResult ChangePassword()
        {
            ViewBag.PasswordLength = MembershipService.MinPasswordLength;
            return View();
        }

        [Authorize]
        [HttpPost]
        public ActionResult ChangePassword(ChangePasswordModel model)
        {
            if (ModelState.IsValid)
            {
                if (MembershipService.ChangePassword(User.Identity.Name, model.OldPassword, model.NewPassword))
                {
                    return RedirectToAction("ChangePasswordSuccess");
                }
                else
                {
                    ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
                }
            }

            // If we got this far, something failed, redisplay form
            ViewBag.PasswordLength = MembershipService.MinPasswordLength;
            return View(model);
        }

        // **************************************
        // URL: /Account/ChangePasswordSuccess
        // **************************************

        public ActionResult ChangePasswordSuccess()
        {
            return View();
        }

    }
}