diff options
Diffstat (limited to 'src/OpenID/OpenIdRelyingPartyMvc/Controllers/UserController.cs')
-rw-r--r-- | src/OpenID/OpenIdRelyingPartyMvc/Controllers/UserController.cs | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/OpenID/OpenIdRelyingPartyMvc/Controllers/UserController.cs b/src/OpenID/OpenIdRelyingPartyMvc/Controllers/UserController.cs new file mode 100644 index 0000000..3ff405f --- /dev/null +++ b/src/OpenID/OpenIdRelyingPartyMvc/Controllers/UserController.cs @@ -0,0 +1,72 @@ +namespace OpenIdRelyingPartyMvc.Controllers { + using System; + using System.Collections.Generic; + using System.Linq; + using System.Web; + using System.Web.Mvc; + using System.Web.Security; + using DotNetOpenAuth.Messaging; + using DotNetOpenAuth.OpenId; + using DotNetOpenAuth.OpenId.RelyingParty; + + public class UserController : Controller { + private static OpenIdRelyingParty openid = new OpenIdRelyingParty(); + + public ActionResult Index() { + if (!User.Identity.IsAuthenticated) { + Response.Redirect("~/User/Login?ReturnUrl=Index"); + } + + return View("Index"); + } + + public ActionResult Logout() { + FormsAuthentication.SignOut(); + return Redirect("~/Home"); + } + + public ActionResult Login() { + // Stage 1: display login form to user + return View("Login"); + } + + [ValidateInput(false)] + public ActionResult Authenticate(string returnUrl) { + var response = openid.GetResponse(); + if (response == null) { + // Stage 2: user submitting Identifier + Identifier id; + if (Identifier.TryParse(Request.Form["openid_identifier"], out id)) { + try { + return openid.CreateRequest(Request.Form["openid_identifier"]).RedirectingResponse.AsActionResult(); + } catch (ProtocolException ex) { + ViewData["Message"] = ex.Message; + return View("Login"); + } + } else { + ViewData["Message"] = "Invalid identifier"; + return View("Login"); + } + } else { + // Stage 3: OpenID Provider sending assertion response + switch (response.Status) { + case AuthenticationStatus.Authenticated: + Session["FriendlyIdentifier"] = response.FriendlyIdentifierForDisplay; + FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false); + if (!string.IsNullOrEmpty(returnUrl)) { + return Redirect(returnUrl); + } else { + return RedirectToAction("Index", "Home"); + } + case AuthenticationStatus.Canceled: + ViewData["Message"] = "Canceled at provider"; + return View("Login"); + case AuthenticationStatus.Failed: + ViewData["Message"] = response.Exception.Message; + return View("Login"); + } + } + return new EmptyResult(); + } + } +} |