diff options
author | Richard Collette <rcollette@yahoo.com> | 2014-12-26 13:18:59 -0500 |
---|---|---|
committer | Richard Collette <rcollette@yahoo.com> | 2014-12-26 13:18:59 -0500 |
commit | b6bf259bc1d6a924207f5ac7e7b9b016aa87b73a (patch) | |
tree | ad429c35b75904caef2ea93951b512d0014e6a4c /samples/OpenIdProviderMvc/Controllers/OpenIdController.cs | |
parent | 761bdd66da6e9ff6412a76b4a36cb721869f48b1 (diff) | |
download | DotNetOpenAuth-b6bf259bc1d6a924207f5ac7e7b9b016aa87b73a.zip DotNetOpenAuth-b6bf259bc1d6a924207f5ac7e7b9b016aa87b73a.tar.gz DotNetOpenAuth-b6bf259bc1d6a924207f5ac7e7b9b016aa87b73a.tar.bz2 |
Corrected indentation back to being tab based.
Diffstat (limited to 'samples/OpenIdProviderMvc/Controllers/OpenIdController.cs')
-rw-r--r-- | samples/OpenIdProviderMvc/Controllers/OpenIdController.cs | 386 |
1 files changed, 193 insertions, 193 deletions
diff --git a/samples/OpenIdProviderMvc/Controllers/OpenIdController.cs b/samples/OpenIdProviderMvc/Controllers/OpenIdController.cs index 14014db..62c5f7f 100644 --- a/samples/OpenIdProviderMvc/Controllers/OpenIdController.cs +++ b/samples/OpenIdProviderMvc/Controllers/OpenIdController.cs @@ -7,273 +7,273 @@ namespace OpenIdProviderMvc.Controllers { using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; - using DotNetOpenAuth.Messaging; + using DotNetOpenAuth.Messaging; using DotNetOpenAuth.OpenId; using DotNetOpenAuth.OpenId.Behaviors; - using DotNetOpenAuth.OpenId.Extensions.ProviderAuthenticationPolicy; - using DotNetOpenAuth.OpenId.Extensions.SimpleRegistration; - using DotNetOpenAuth.OpenId.Provider; - using DotNetOpenAuth.OpenId.Provider.Behaviors; - using OpenIdProviderMvc.Code; + using DotNetOpenAuth.OpenId.Extensions.ProviderAuthenticationPolicy; + using DotNetOpenAuth.OpenId.Extensions.SimpleRegistration; + using DotNetOpenAuth.OpenId.Provider; + using DotNetOpenAuth.OpenId.Provider.Behaviors; + using OpenIdProviderMvc.Code; public class OpenIdController : Controller { - internal static OpenIdProvider OpenIdProvider = new OpenIdProvider(); + internal static OpenIdProvider OpenIdProvider = new OpenIdProvider(); - public OpenIdController() + public OpenIdController() : this(null) { - } + } public OpenIdController(IFormsAuthentication formsAuthentication) { - this.FormsAuth = formsAuthentication ?? new FormsAuthenticationService(); - } + this.FormsAuth = formsAuthentication ?? new FormsAuthenticationService(); + } - public IFormsAuthentication FormsAuth { get; private set; } + public IFormsAuthentication FormsAuth { get; private set; } - [ValidateInput(false)] + [ValidateInput(false)] public async Task<ActionResult> Provider() { - IRequest request = await OpenIdProvider.GetRequestAsync(this.Request, this.Response.ClientDisconnectedToken); + IRequest request = await OpenIdProvider.GetRequestAsync(this.Request, this.Response.ClientDisconnectedToken); if (request != null) { - // Some requests are automatically handled by DotNetOpenAuth. If this is one, go ahead and let it go. + // Some requests are automatically handled by DotNetOpenAuth. If this is one, go ahead and let it go. if (request.IsResponseReady) { - var response = await OpenIdProvider.PrepareResponseAsync(request, this.Response.ClientDisconnectedToken); - Response.ContentType = response.Content.Headers.ContentType.ToString(); - return response.AsActionResult(); - } + var response = await OpenIdProvider.PrepareResponseAsync(request, this.Response.ClientDisconnectedToken); + Response.ContentType = response.Content.Headers.ContentType.ToString(); + return response.AsActionResult(); + } - // This is apparently one that the host (the web site itself) has to respond to. - ProviderEndpoint.PendingRequest = (IHostProcessedRequest)request; + // This is apparently one that the host (the web site itself) has to respond to. + ProviderEndpoint.PendingRequest = (IHostProcessedRequest)request; - // If PAPE requires that the user has logged in recently, we may be required to challenge the user to log in. - var papeRequest = ProviderEndpoint.PendingRequest.GetExtension<PolicyRequest>(); + // If PAPE requires that the user has logged in recently, we may be required to challenge the user to log in. + var papeRequest = ProviderEndpoint.PendingRequest.GetExtension<PolicyRequest>(); if (papeRequest != null && papeRequest.MaximumAuthenticationAge.HasValue) { - TimeSpan timeSinceLogin = DateTime.UtcNow - this.FormsAuth.SignedInTimestampUtc.Value; + TimeSpan timeSinceLogin = DateTime.UtcNow - this.FormsAuth.SignedInTimestampUtc.Value; if (timeSinceLogin > papeRequest.MaximumAuthenticationAge.Value) { - // The RP wants the user to have logged in more recently than he has. - // We'll have to redirect the user to a login screen. - return this.RedirectToAction("LogOn", "Account", new { returnUrl = this.Url.Action("ProcessAuthRequest") }); - } - } + // The RP wants the user to have logged in more recently than he has. + // We'll have to redirect the user to a login screen. + return this.RedirectToAction("LogOn", "Account", new { returnUrl = this.Url.Action("ProcessAuthRequest") }); + } + } - return await this.ProcessAuthRequest(); + return await this.ProcessAuthRequest(); } else { - // No OpenID request was recognized. This may be a user that stumbled on the OP Endpoint. - return this.View(); - } - } + // No OpenID request was recognized. This may be a user that stumbled on the OP Endpoint. + return this.View(); + } + } public async Task<ActionResult> ProcessAuthRequest() { if (ProviderEndpoint.PendingRequest == null) { - return this.RedirectToAction("Index", "Home"); - } + return this.RedirectToAction("Index", "Home"); + } - // Try responding immediately if possible. - ActionResult response = await this.AutoRespondIfPossibleAsync(); + // Try responding immediately if possible. + ActionResult response = await this.AutoRespondIfPossibleAsync(); if (response != null) { - return response; - } + return response; + } - // We can't respond immediately with a positive result. But if we still have to respond immediately... + // We can't respond immediately with a positive result. But if we still have to respond immediately... if (ProviderEndpoint.PendingRequest.Immediate) { - // We can't stop to prompt the user -- we must just return a negative response. - return await this.SendAssertion(); - } - - return this.RedirectToAction("AskUser"); - } - - /// <summary> - /// Displays a confirmation page. - /// </summary> - /// <returns>The response for the user agent.</returns> - [Authorize] + // We can't stop to prompt the user -- we must just return a negative response. + return await this.SendAssertion(); + } + + return this.RedirectToAction("AskUser"); + } + + /// <summary> + /// Displays a confirmation page. + /// </summary> + /// <returns>The response for the user agent.</returns> + [Authorize] public async Task<ActionResult> AskUser() { if (ProviderEndpoint.PendingRequest == null) { - // Oops... precious little we can confirm without a pending OpenID request. - return this.RedirectToAction("Index", "Home"); - } + // Oops... precious little we can confirm without a pending OpenID request. + return this.RedirectToAction("Index", "Home"); + } - // The user MAY have just logged in. Try again to respond automatically to the RP if appropriate. - ActionResult response = await this.AutoRespondIfPossibleAsync(); + // The user MAY have just logged in. Try again to respond automatically to the RP if appropriate. + ActionResult response = await this.AutoRespondIfPossibleAsync(); if (response != null) { - return response; - } + return response; + } - if (!ProviderEndpoint.PendingAuthenticationRequest.IsDirectedIdentity && + if (!ProviderEndpoint.PendingAuthenticationRequest.IsDirectedIdentity && !this.UserControlsIdentifier(ProviderEndpoint.PendingAuthenticationRequest)) { - return this.Redirect(this.Url.Action("LogOn", "Account", new { returnUrl = this.Request.Url })); - } + return this.Redirect(this.Url.Action("LogOn", "Account", new { returnUrl = this.Request.Url })); + } - this.ViewData["Realm"] = ProviderEndpoint.PendingRequest.Realm; + this.ViewData["Realm"] = ProviderEndpoint.PendingRequest.Realm; - return this.View(); - } + return this.View(); + } - [HttpPost, Authorize, ValidateAntiForgeryToken] + [HttpPost, Authorize, ValidateAntiForgeryToken] public async Task<ActionResult> AskUserResponse(bool confirmed) { - if (!ProviderEndpoint.PendingAuthenticationRequest.IsDirectedIdentity && + if (!ProviderEndpoint.PendingAuthenticationRequest.IsDirectedIdentity && !this.UserControlsIdentifier(ProviderEndpoint.PendingAuthenticationRequest)) { - // The user shouldn't have gotten this far without controlling the identifier we'd send an assertion for. - return new HttpStatusCodeResult((int)HttpStatusCode.BadRequest); - } + // The user shouldn't have gotten this far without controlling the identifier we'd send an assertion for. + return new HttpStatusCodeResult((int)HttpStatusCode.BadRequest); + } if (ProviderEndpoint.PendingAnonymousRequest != null) { - ProviderEndpoint.PendingAnonymousRequest.IsApproved = confirmed; + ProviderEndpoint.PendingAnonymousRequest.IsApproved = confirmed; } else if (ProviderEndpoint.PendingAuthenticationRequest != null) { - ProviderEndpoint.PendingAuthenticationRequest.IsAuthenticated = confirmed; + ProviderEndpoint.PendingAuthenticationRequest.IsAuthenticated = confirmed; } else { - throw new InvalidOperationException("There's no pending authentication request!"); - } + throw new InvalidOperationException("There's no pending authentication request!"); + } - return await this.SendAssertion(); - } + return await this.SendAssertion(); + } - /// <summary> - /// Sends a positive or a negative assertion, based on how the pending request is currently marked. - /// </summary> - /// <returns>An MVC redirect result.</returns> + /// <summary> + /// Sends a positive or a negative assertion, based on how the pending request is currently marked. + /// </summary> + /// <returns>An MVC redirect result.</returns> public async Task<ActionResult> SendAssertion() { - var pendingRequest = ProviderEndpoint.PendingRequest; - var authReq = pendingRequest as IAuthenticationRequest; - var anonReq = pendingRequest as IAnonymousRequest; - ProviderEndpoint.PendingRequest = null; // clear session static so we don't do this again + var pendingRequest = ProviderEndpoint.PendingRequest; + var authReq = pendingRequest as IAuthenticationRequest; + var anonReq = pendingRequest as IAnonymousRequest; + ProviderEndpoint.PendingRequest = null; // clear session static so we don't do this again if (pendingRequest == null) { - throw new InvalidOperationException("There's no pending authentication request!"); - } + throw new InvalidOperationException("There's no pending authentication request!"); + } - // Set safe defaults if somehow the user ended up (perhaps through XSRF) here before electing to send data to the RP. + // Set safe defaults if somehow the user ended up (perhaps through XSRF) here before electing to send data to the RP. if (anonReq != null && !anonReq.IsApproved.HasValue) { - anonReq.IsApproved = false; - } + anonReq.IsApproved = false; + } if (authReq != null && !authReq.IsAuthenticated.HasValue) { - authReq.IsAuthenticated = false; - } + authReq.IsAuthenticated = false; + } if (authReq != null && authReq.IsAuthenticated.Value) { if (authReq.IsDirectedIdentity) { - authReq.LocalIdentifier = Models.User.GetClaimedIdentifierForUser(User.Identity.Name); - } + authReq.LocalIdentifier = Models.User.GetClaimedIdentifierForUser(User.Identity.Name); + } if (!authReq.IsDelegatedIdentifier) { - authReq.ClaimedIdentifier = authReq.LocalIdentifier; - } - } + authReq.ClaimedIdentifier = authReq.LocalIdentifier; + } + } - // Respond to AX/sreg extension requests only on a positive result. - if ((authReq != null && authReq.IsAuthenticated.Value) || + // Respond to AX/sreg extension requests only on a positive result. + if ((authReq != null && authReq.IsAuthenticated.Value) || (anonReq != null && anonReq.IsApproved.Value)) { - // Look for a Simple Registration request. When the AXFetchAsSregTransform behavior is turned on - // in the web.config file as it is in this sample, AX requests will come in as SReg requests. - var claimsRequest = pendingRequest.GetExtension<ClaimsRequest>(); + // Look for a Simple Registration request. When the AXFetchAsSregTransform behavior is turned on + // in the web.config file as it is in this sample, AX requests will come in as SReg requests. + var claimsRequest = pendingRequest.GetExtension<ClaimsRequest>(); if (claimsRequest != null) { - var claimsResponse = claimsRequest.CreateResponse(); + var claimsResponse = claimsRequest.CreateResponse(); - // This simple respond to a request check may be enhanced to only respond to an individual attribute - // request if the user consents to it explicitly, in which case this response extension creation can take - // place in the confirmation page action rather than here. + // This simple respond to a request check may be enhanced to only respond to an individual attribute + // request if the user consents to it explicitly, in which case this response extension creation can take + // place in the confirmation page action rather than here. if (claimsRequest.Email != DemandLevel.NoRequest) { - claimsResponse.Email = User.Identity.Name + "@dotnetopenauth.net"; - } + claimsResponse.Email = User.Identity.Name + "@dotnetopenauth.net"; + } - pendingRequest.AddResponseExtension(claimsResponse); - } + pendingRequest.AddResponseExtension(claimsResponse); + } - // Look for PAPE requests. - var papeRequest = pendingRequest.GetExtension<PolicyRequest>(); + // Look for PAPE requests. + var papeRequest = pendingRequest.GetExtension<PolicyRequest>(); if (papeRequest != null) { - var papeResponse = new PolicyResponse(); + var papeResponse = new PolicyResponse(); if (papeRequest.MaximumAuthenticationAge.HasValue) { - papeResponse.AuthenticationTimeUtc = this.FormsAuth.SignedInTimestampUtc; - } - - pendingRequest.AddResponseExtension(papeResponse); - } - } - - var response = await OpenIdProvider.PrepareResponseAsync(pendingRequest, this.Response.ClientDisconnectedToken); - Response.ContentType = response.Content.Headers.ContentType.ToString(); - return response.AsActionResult(); - } - - /// <summary> - /// Attempts to formulate an automatic response to the RP if the user's profile allows it. - /// </summary> - /// <returns>The ActionResult for the caller to return, or <c>null</c> if no automatic response can be made.</returns> + papeResponse.AuthenticationTimeUtc = this.FormsAuth.SignedInTimestampUtc; + } + + pendingRequest.AddResponseExtension(papeResponse); + } + } + + var response = await OpenIdProvider.PrepareResponseAsync(pendingRequest, this.Response.ClientDisconnectedToken); + Response.ContentType = response.Content.Headers.ContentType.ToString(); + return response.AsActionResult(); + } + + /// <summary> + /// Attempts to formulate an automatic response to the RP if the user's profile allows it. + /// </summary> + /// <returns>The ActionResult for the caller to return, or <c>null</c> if no automatic response can be made.</returns> private async Task<ActionResult> AutoRespondIfPossibleAsync() { - // If the odds are good we can respond to this one immediately (without prompting the user)... - if (await ProviderEndpoint.PendingRequest.IsReturnUrlDiscoverableAsync(OpenIdProvider.Channel.HostFactories, this.Response.ClientDisconnectedToken) == RelyingPartyDiscoveryResult.Success - && User.Identity.IsAuthenticated + // If the odds are good we can respond to this one immediately (without prompting the user)... + if (await ProviderEndpoint.PendingRequest.IsReturnUrlDiscoverableAsync(OpenIdProvider.Channel.HostFactories, this.Response.ClientDisconnectedToken) == RelyingPartyDiscoveryResult.Success + && User.Identity.IsAuthenticated && this.HasUserAuthorizedAutoLogin(ProviderEndpoint.PendingRequest)) { - // Is this is an identity authentication request? (as opposed to an anonymous request)... + // Is this is an identity authentication request? (as opposed to an anonymous request)... if (ProviderEndpoint.PendingAuthenticationRequest != null) { - // If this is directed identity, or if the claimed identifier being checked is controlled by the current user... - if (ProviderEndpoint.PendingAuthenticationRequest.IsDirectedIdentity + // If this is directed identity, or if the claimed identifier being checked is controlled by the current user... + if (ProviderEndpoint.PendingAuthenticationRequest.IsDirectedIdentity || this.UserControlsIdentifier(ProviderEndpoint.PendingAuthenticationRequest)) { - ProviderEndpoint.PendingAuthenticationRequest.IsAuthenticated = true; - return await this.SendAssertion(); - } - } + ProviderEndpoint.PendingAuthenticationRequest.IsAuthenticated = true; + return await this.SendAssertion(); + } + } - // If this is an anonymous request, we can respond to that too. + // If this is an anonymous request, we can respond to that too. if (ProviderEndpoint.PendingAnonymousRequest != null) { - ProviderEndpoint.PendingAnonymousRequest.IsApproved = true; - return await this.SendAssertion(); - } - } - - return null; - } - - /// <summary> - /// Determines whether the currently logged in user has authorized auto login to the requesting relying party. - /// </summary> - /// <param name="request">The incoming request.</param> - /// <returns> - /// <c>true</c> if it is safe to respond affirmatively to this request and all extensions - /// without further user confirmation; otherwise, <c>false</c>. - /// </returns> + ProviderEndpoint.PendingAnonymousRequest.IsApproved = true; + return await this.SendAssertion(); + } + } + + return null; + } + + /// <summary> + /// Determines whether the currently logged in user has authorized auto login to the requesting relying party. + /// </summary> + /// <param name="request">The incoming request.</param> + /// <returns> + /// <c>true</c> if it is safe to respond affirmatively to this request and all extensions + /// without further user confirmation; otherwise, <c>false</c>. + /// </returns> private bool HasUserAuthorizedAutoLogin(IHostProcessedRequest request) { - // TODO: host should implement this method meaningfully, consulting their user database. - // Make sure the user likes the RP + // TODO: host should implement this method meaningfully, consulting their user database. + // Make sure the user likes the RP if (true/*User.UserLikesRP(request.Realm))*/) { - // And make sure the RP is only asking for information about the user that the user has granted before. + // And make sure the RP is only asking for information about the user that the user has granted before. if (true/*User.HasGrantedExtensions(request)*/) { - // For now for the purposes of the sample, we'll disallow auto-logins when an sreg request is present. + // For now for the purposes of the sample, we'll disallow auto-logins when an sreg request is present. if (request.GetExtension<ClaimsRequest>() != null) { - return false; - } - - return true; - } - } - - // If we aren't sure the user likes this site and is willing to disclose the requested info, return false - // so the user has the opportunity to explicity choose whether to share his/her info. - return false; - } - - /// <summary> - /// Checks whether the logged in user controls the OP local identifier in the given authentication request. - /// </summary> - /// <param name="authReq">The authentication request.</param> - /// <returns><c>true</c> if the user controls the identifier; <c>false</c> otherwise.</returns> + return false; + } + + return true; + } + } + + // If we aren't sure the user likes this site and is willing to disclose the requested info, return false + // so the user has the opportunity to explicity choose whether to share his/her info. + return false; + } + + /// <summary> + /// Checks whether the logged in user controls the OP local identifier in the given authentication request. + /// </summary> + /// <param name="authReq">The authentication request.</param> + /// <returns><c>true</c> if the user controls the identifier; <c>false</c> otherwise.</returns> private bool UserControlsIdentifier(IAuthenticationRequest authReq) { if (authReq == null) { - throw new ArgumentNullException("authReq"); - } + throw new ArgumentNullException("authReq"); + } if (User == null || User.Identity == null) { - return false; - } - - Uri userLocalIdentifier = Models.User.GetClaimedIdentifierForUser(User.Identity.Name); - - // Assuming the URLs on the web server are not case sensitive (on Windows servers they almost never are), - // and usernames aren't either, compare the identifiers without case sensitivity. - // No reason to do this for the PPID identifiers though, since they *can* be case sensitive and are highly - // unlikely to be typed in by the user anyway. - return string.Equals(authReq.LocalIdentifier.ToString(), userLocalIdentifier.ToString(), StringComparison.OrdinalIgnoreCase) || - authReq.LocalIdentifier == PpidGeneration.PpidIdentifierProvider.GetIdentifier(userLocalIdentifier, authReq.Realm); - } - } -}
\ No newline at end of file + return false; + } + + Uri userLocalIdentifier = Models.User.GetClaimedIdentifierForUser(User.Identity.Name); + + // Assuming the URLs on the web server are not case sensitive (on Windows servers they almost never are), + // and usernames aren't either, compare the identifiers without case sensitivity. + // No reason to do this for the PPID identifiers though, since they *can* be case sensitive and are highly + // unlikely to be typed in by the user anyway. + return string.Equals(authReq.LocalIdentifier.ToString(), userLocalIdentifier.ToString(), StringComparison.OrdinalIgnoreCase) || + authReq.LocalIdentifier == PpidGeneration.PpidIdentifierProvider.GetIdentifier(userLocalIdentifier, authReq.Realm); + } + } +} |