, . .
, ():
(1) ( ) API "XSRF-TOKEN" , . , AngularJS CSRF.
(2) , AngularJS cookie "XSRF-TOKEN", "X-XSRF-TOKEN" .
, API XSRF, - . Web API XSRF. ( #) . , ( ):
public class ValidateAntiForgeryToken : ActionFilterAttribute
{
private const string XsrfCookieName = "XSRF-TOKEN";
private const string XsrfHeaderName = "X-XSRF-TOKEN";
private const string CsrfTokenSalt = "RANDOM SALT";
public override void OnActionExecuting(HttpActionContext filterContext)
{
string requestMethod = filterContext.Request.Method.Method;
Boolean isValid = true;
if (requestMethod != "GET")
{
var headerToken = filterContext.Request.Headers.Where(x => x.Key.Equals(XsrfHeaderName, StringComparison.OrdinalIgnoreCase))
.Select(x => x.Value).SelectMany(x => x).FirstOrDefault();
var cookieToken = filterContext.Request.Headers.GetCookies().Select(x => x[XsrfCookieName]).FirstOrDefault();
if (cookieToken == null || headerToken == null)
{
isValid = false;
}
if (isValid && !String.Equals(headerToken, cookieToken.Value, StringComparison.OrdinalIgnoreCase))
{
isValid = false;
}
if (!isValid)
{
filterContext.Response = filterContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
filterContext.Response.ReasonPhrase = "Unauthorized to make that request.";
return;
}
}
base.OnActionExecuting(filterContext);
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
string textToHash = RandomStringGeneration();
string cookieText = HashService.HashText(textToHash, CsrfTokenSalt);
var cookie = new CookieHeaderValue(XsrfCookieName, HttpUtility.UrlEncode(cookieText));
cookie.Secure = true;
cookie.HttpOnly = false;
cookie.Path = "/";
actionExecutedContext.Response.Headers.AddCookies(new[] { cookie });
base.OnActionExecuted(actionExecutedContext);
}
}
HashService.HashText():
public class HashService
{
public static string HashText(string text, string salt)
{
SHA512Managed hashString = new SHA512Managed();
byte[] textWithSaltBytes = Encoding.UTF8.GetBytes(string.Concat(text, salt));
byte[] hashedBytes = hashString.ComputeHash(textWithSaltBytes);
hashString.Clear();
return Convert.ToBase64String(hashedBytes);
}
}
, - . , , , cookie . , ( , ). XSRF , , . , , API .
$http AngularJS, :
(XSRF): XSRF - . Angular XSRF. XHR, $http cookie ( XSRF-TOKEN) HTTP- (X-XSRF-TOKEN). JavaScript, , cookie, , XHR JavaScript, . .
, JavaScript- XSRF-TOKEN HTTP- GET . XHR , cookie HTTP- X-XSRF-TOKEN, , JavaScript, , . ( JavaScript ). , cookie .
xsrfHeaderName xsrfCookieName $httpProvider.defaults config-time, $http.defaults .