2014-07-07 25 views
6

Jak korzystać z wielu @Html.AntiForgeryToken() na jednej stronie?sposób użycia dwóch AntiForgeryToken na jednej stronie bez użycia wycofanej właściwości "Salt"

Po umieszczeniu go nie działa na zdalnym hoście, tylko lokalnie!

Próbuję użyć różne łańcuchy foreach fałszerstwa tokena @Html.AntiForgeryToken("logoff_forgery") ale kiedy dodać [ValidateAntiForgeryToken(Salt = "logoff_forgery")] w kontrolerze, otrzymuję ten następujący błąd

'System.Web.Mvc.ValidateAntiForgeryTokenAttribute.Salt' 
    'The 'Salt' property is deprecated. 
    To specify custom data to be embedded within the token, 
    use the static AntiForgeryConfig.AdditionalDataProvider property.' 
    D:\projects\codesan\app\CodeSan\CodeSan\Controllers\AccountController.cs 
    289 35 CodeSan 

czy ktoś wie, jak używać statycznego AntiForgeryConfig.AdditionalDataProvider? Jeśli tak, podziel się mną ze mną.

+0

można umieścić jak najwięcej 'Html.AntiForgeryToken()' w sposób wyświetl jak chcesz. Jaki jest problem? –

+0

Czyni to, że nie będzie działać na zdalnym hoście ... – Bellash

Odpowiedz

2

Zgodnie z opisem w opisie właściwość Salt jest przestarzała.

Oto proste wdrożenie dla IAntiForgeryAdditionalDataProvider

public class MyAntiForgeryAdditionalDataProvider : IAntiForgeryAdditionalDataProvider 
{ 
    public string GetAdditionalData(HttpContextBase context) 
    { 
     return GenerateTokenAndSaveItToTheDB(); 
    } 

    public bool ValidateAdditionalData(HttpContextBase context, string additionalData) 
    { 
     Guid token = Guid.TryParse(additionalData, out token) ? token : Guid.Empty; 
     if (token == Guid.Empty) return false; 

     return GetIfTokenIsFoundInTheDBAndNotExpired(token); 
    } 

    private string GenerateTokenAndSaveItToTheDB() 
    { 
     var newToken = Guid.NewGuid().ToString(); 
     //save it to the db 
     return newToken; 
    } 
} 

A wystarczy zarejestrować ją w Global.asax.cs

protected void Application_Start() 
{ 
    AntiForgeryConfig.AdditionalDataProvider = new MyAntiForgeryAdditionalDataProvider(); 
} 
+0

Dziękuję, ale spróbuję dalej za 18 godzin ... – Bellash

+0

I jak tego użyć? 'Html.AntiForgeryToken()' lub 'Html.MyAntiForgery()'? i masz na myśli to, że dla każdej strony zapiszę token w bazie danych? jak ciężkie jest to rozwiązanie! – Bellash

+1

W twoim widoku używasz 'Html.AntiForgeryToken()' i kiedykolwiek wynik zostanie wygenerowany, wywoła 'GetAdditionalData()', aby umieścić go w tokenie. To był tylko przykład. Nie musisz korzystać z bazy danych, może to być statyczna wartość zakodowana na sztywno lub coś z "żądania". Podałem ci przykład, żebyś zaczął. –