public ActionResult ProcessFederationRequest()
{
var action = Request.QueryString[WSFederationConstants.Parameters.Action];
try
{
switch (action)
{
case WSFederationConstants.Actions.SignIn:
{
var requestMessage = (SignInRequestMessage)WSFederationMessage.CreateFromUri(Request.Url);
if (User != null && User.Identity != null && User.Identity.IsAuthenticated)
{
var sts = new MultiProtocolSecurityTokenService(MultiProtocolSecurityTokenServiceConfiguration.Current);
var responseMessage = FederatedPassiveSecurityTokenServiceOperations.ProcessSignInRequest(requestMessage, User, sts);
responseMessage.Write(Response.Output);
Response.Flush();
Response.End();
HttpContext.ApplicationInstance.CompleteRequest();
}
else
{
// user not authenticated yet, look for whr, if not there go to HomeRealmDiscovery page
this.CreateFederationContext();
if (string.IsNullOrEmpty(this.Request.QueryString[WSFederationConstants.Parameters.HomeRealm]))
{
return this.RedirectToAction("HomeRealmDiscovery");
}
else
{
return this.Authenticate();
}
}
}
break;
case WSFederationConstants.Actions.SignOut:
{
var requestMessage = (SignOutRequestMessage)WSFederationMessage.CreateFromUri(Request.Url);
FederatedPassiveSecurityTokenServiceOperations.ProcessSignOutRequest(requestMessage, User, requestMessage.Reply, HttpContext.ApplicationInstance.Response);
}
break;
default:
throw new InvalidOperationException(
String.Format(
CultureInfo.InvariantCulture,
"The action '{0}' (Request.QueryString['{1}']) is unexpected. Expected actions are: '{2}' or '{3}'.",
String.IsNullOrEmpty(action) ? "<EMPTY>" : action,
WSFederationConstants.Parameters.Action,
WSFederationConstants.Actions.SignIn,
WSFederationConstants.Actions.SignOut));
}
}
catch (Exception exception)
{
throw new Exception("An unexpected error occurred when processing the request. See inner exception for details.", exception);
}
return null;
}