2014-07-07 11 views
6

deprecato 'Salt' Come usare molti @Html.AntiForgeryToken() in una pagina?come utilizzare due AntiForgeryToken in una singola pagina senza utilizzare la proprietà

Quando lo inserisco non funziona sull'host remoto, solo localmente!

Ho cercato di usare diverse stringhe falsificazione foreach gettone @Html.AntiForgeryToken("logoff_forgery") ma quando aggiungo [ValidateAntiForgeryToken(Salt = "logoff_forgery")] nel controller, ottengo questo errore seguente

'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 

Qualcuno sa come utilizzare la statica AntiForgeryConfig.AdditionalDataProvider? Se si, per favore, condividilo con me.

+0

È possibile includere il maggior numero 'Html.AntiForgeryToken()' in un guarda come vuoi Qual è il problema? –

+0

In questo modo non funzionerà su host remoto ... – Bellash

risposta

2

Come si legge nella descrizione Salt proprietà è deprecato.

Ecco una semplice implementazione per 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; 
    } 
} 

E basta registrarla alle Global.asax.cs

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

Grazie ma proverò il prossimo a 18 ore ... – Bellash

+0

E come lo uso? 'Html.AntiForgeryToken()' o 'Html.MyAntiForgery()'? e intendi che per ogni pagina salverò il token nel database? quanto è pesante questa soluzione! – Bellash

+1

Nella tua vista usi 'Html.AntiForgeryToken()' e ogni volta che l'output è generato chiamerà 'GetAdditionalData()' per metterlo nel token. Questo era solo un esempio. Non è necessario utilizzare il db, può essere un valore di guida hardcoded statico o qualcosa del 'Request'. Ti ho appena dato un esempio per iniziare. –

Problemi correlati