我正在看github中的SS代碼,我無法找到任何與ValidateAntiForgeryToken等價的東西,因爲我不想重新發明輪子,我想盡可能重用SS框架,我認爲一個解決方案可能是創建一個自定義的RequestFilterAttribute,其他想法?ServiceStack中是否有任何與ValidateAntiForgeryToken相當的功能?
2
A
回答
3
我結束了創建與asp.net的MVC
這種類似的能力requestFilterAttibute是我的代碼完成迄今爲止:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
public class ValidateHttpAntiForgeryToken : RequestFilterAttribute
{
public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto)
{
try
{
if (IsAjaxRequest(req))
ValidateRequestHeader(req);
else
AntiForgery.Validate();
}
catch (Exception ex)
{
res.StatusCode = 403;
res.StatusDescription = ex.Message;
}
}
private void ValidateRequestHeader(IHttpRequest req)
{
var cookie = req.Cookies.FirstOrDefault(c => c.Value.Name.Contains(AntiForgeryConfig.CookieName));
if (cookie.Value == null)
{
throw new HttpAntiForgeryException(String.Format("Missing {0} cookie", AntiForgeryConfig.CookieName));
}
IEnumerable<string> xXsrfHeaders = req.Headers.GetValues("__RequestVerificationToken");
if (xXsrfHeaders == null || !xXsrfHeaders.Any())
throw new HttpAntiForgeryException("Missing X-XSRF-Token HTTP header");
AntiForgery.Validate(cookie.Value.Value, xXsrfHeaders.FirstOrDefault());
}
private static bool IsAjaxRequest(IHttpRequest request)
{
IEnumerable<string> xRequestedWithHeaders = request.Headers.GetValues("X-Requested-With");
if (xRequestedWithHeaders != null && xRequestedWithHeaders.Any())
{
string headerValue = xRequestedWithHeaders.FirstOrDefault();
if (!String.IsNullOrEmpty(headerValue))
{
return String.Equals(headerValue, "XMLHttpRequest", StringComparison.OrdinalIgnoreCase);
}
}
return false;
}
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
public class ValidateHttpAntiForgeryToken : RequestFilterAttribute
{
public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto)
{
try
{
if (IsAjaxRequest(req))
ValidateRequestHeader(req);
else
AntiForgery.Validate();
}
catch (Exception ex)
{
res.StatusCode = 403;
res.StatusDescription = ex.Message;
}
}
private void ValidateRequestHeader(IHttpRequest req)
{
var cookie = req.Cookies.FirstOrDefault(c => c.Value.Name.Contains(AntiForgeryConfig.CookieName));
if (cookie.Value == null)
{
throw new HttpAntiForgeryException(String.Format("Missing {0} cookie", AntiForgeryConfig.CookieName));
}
IEnumerable<string> xXsrfHeaders = req.Headers.GetValues("__RequestVerificationToken");
if (xXsrfHeaders == null || !xXsrfHeaders.Any())
throw new HttpAntiForgeryException("Missing X-XSRF-Token HTTP header");
AntiForgery.Validate(cookie.Value.Value, xXsrfHeaders.FirstOrDefault());
}
private static bool IsAjaxRequest(IHttpRequest request)
{
IEnumerable<string> xRequestedWithHeaders = request.Headers.GetValues("X-Requested-With");
if (xRequestedWithHeaders != null && xRequestedWithHeaders.Any())
{
string headerValue = xRequestedWithHeaders.FirstOrDefault();
if (!String.IsNullOrEmpty(headerValue))
{
return String.Equals(headerValue, "XMLHttpRequest", StringComparison.OrdinalIgnoreCase);
}
}
return false;
}
}
3
相關問題
- 1. 是否有任何PowerBuilder的功能,相當於PHP的「爆炸」功能
- 2. 是否有與C#中的F#Seq.windowed相當的功能?
- 3. 在R中是否有與gnuplot的「epslatex」相當的功能?
- 4. 在Pascal中是否有與C的__LINE__宏相當的功能?
- 5. 在PDO中是否有與MySQL的「multi_query()」相當的功能?
- 6. 是否有與.net中的Javascript函數.closest()相當的功能?
- 7. 在RoR中是否有與PHP的gmdate相當的功能?
- 8. 是否有與SAS中的R函數表相當的功能?
- 9. 是否有與ASP.NET中的Java EE ServletContext相當的功能?
- 10. 在vbscript中是否有與Java的HashSet相當的功能?
- 11. 在python中是否有與emacs'rx宏相當的功能?
- 12. 在nodeunit中是否有與assertFalse相當的功能?
- 13. 在單聲道中是否有與「-rdynamic」相當的功能?
- 14. 在WPF中是否有與ASP.NET「IsPostBack」相當的功能?
- 15. OpenSL ES中是否有與OpenAL <alc.h>相當的功能?
- 16. 在Safari/WebKit中是否有與ctrl-shift-r相當的功能?
- 17. 在python中是否有與MATLAB函數bsxfun相當的功能?
- 18. 在Parallel.ForEach中是否有與「繼續」相當的功能?
- 19. Oracle:在PostgreSQL中是否有與ROW相當的功能?
- 20. 在.NET中是否有與WinAPI GetColorDirectory相當的功能?
- 21. WinRT XAML中是否有與CombinedGeometry相當的功能?
- 22. 在Safari中是否有與chrome.windows.getCurrent相當的功能?
- 23. 在Ruby中是否有與yaml.safe_load相當的功能?
- 24. 是否有與ilmerge相反的功能?
- 25. 在LINQ中是否有與SQL Server PARTITION OVER功能相當的功能?
- 26. 在Mac上是否有與Python的os.remove()相當的功能?
- 27. 是否有與XNA的更新功能相當的Objective-C?
- 28. 是否有與Java/Scala的Colander/DictShield相當的功能?
- 29. 是否有與jQuery的.unwrap()for Dojo相當的功能?
- 30. Groovy的Power Asserts是否有與PHP相當的功能?
謝謝@Jon Canning我之前看到過這個代碼,但是我看不到我要如何再次實現Xsrf驗證的完整畫面一種服務方法? –
我知道我可以使用@ Html.AntiForgeryToken()助手來生成令牌,現在我正在尋找一個文件管理器或一個file屬性來驗證請求,如http://kamranicus.com/Blog/Posts/70/protip-using-anti-forgery-token-with-aspnet-web-ap –
實際上,這就是我所要求的:「我認爲解決方案可以創建自定義RequestFilterAttribute,還有其他想法?我只是要求其他選項 –