using System.Collections.Generic;
using System.Web.Routing;
using Microsoft.IdentityModel.Tokens;
using System.Security.Principal;
using System.IdentityModel.Tokens.Jwt;
namespace HelloWorldMvcApp
public class SSOFilterAction : ActionFilterAttribute{
public override void OnActionExecuting(ActionExecutingContext filterContext)
Log("OnActionExecuting", filterContext.RouteData,"inizio filtro");
HttpRequestBase request = filterContext.HttpContext.Request;
HttpResponseBase response = filterContext.HttpContext.Response;
HttpCookie consentCookie = request.Cookies["jwt"];
String redirectUrl = (String)HttpContext.Current.Application ["loginUrl"];
if(consentCookie == null){
filterContext.Result = new RedirectResult(redirectUrl, true);
if(request.FilePath.Contains("logout")){
consentCookie.Expires = DateTime.Now.AddDays(-1);
response.Cookies.Add(consentCookie);
String logOutUrl = (String)HttpContext.Current.Application ["logoutUrl"];
int responseCode=Logout(logOutUrl,consentCookie);
Log("OnActionExecuting", filterContext.RouteData,"Cancellati token a seguito di un logOut");
Log("OnActionExecuting", filterContext.RouteData,"Errore cancellazione token a seguito di un logOut, code: "+responseCode);
filterContext.Result = new RedirectResult(redirectUrl, true);
String jwt=consentCookie.Value;
private int Logout(String url,HttpCookie consentCookie)
using(WebClient webClient = new WebClient()){
var reqparm = new System.Collections.Specialized.NameValueCollection();
reqparm.Add("jwt", consentCookie.Value);
webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
byte[] responsebytes = webClient.UploadValues(url, "POST", reqparm);
String responsebody = Encoding.UTF8.GetString(responsebytes);
return (int)((HttpWebResponse)ex.Response).StatusCode;
private void Log(string methodName, RouteData routeData,String stringMessage)
var controllerName = routeData.Values["controller"];
var actionName = routeData.Values["action"];
var message = String.Format("{0} controller:{1} action:{2} message:{3}", methodName, controllerName, actionName,stringMessage);
Console.WriteLine(message, "Action Filter Log");
private bool ValidateToken(string authToken,String key)
var tokenHandler = new JwtSecurityTokenHandler();
var validationParameters = GetValidationParameters(key);
SecurityToken validatedToken;
IPrincipal principal = tokenHandler.ValidateToken(authToken, validationParameters, out validatedToken);
private TokenValidationParameters GetValidationParameters(String key)
return new TokenValidationParameters()
ValidateLifetime = false,
ValidateAudience = false,
ValidAudience = "Sample",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key))