2015-02-19 8 views
13

Ho bisogno di un'istanza di IDataProtectionProvider per generare token-mail di conferma utilizzando il framework Identity UserManager in un lavoratore Azure Web Lavoro:Come è possibile creare un'istanza OWIN IDataProtectionProvider in Lavori Web di Azure?

var confirmToken = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); 

Questo si blocca a causa di un nulla IUserTokenProvider<User, int> è stato passato al UserManager<User, int> su constuction.

Nell'applicazione MVC un'istanza si crea in questo modo:

public class OWINStartup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var dataProtectionProvider = app.GetDataProtectionProvider(); 

Ma, naturalmente, Azure Web Jobs non ha un gancio OWINStartup. Qualche consiglio?

+0

È possibile inviare le informazioni necessarie per generare il token in un messaggio di coda. E usa quel messaggio nel tuo WebJob per fare ciò che è necessario. – lopezbertoni

+0

Sì, è quello per cui mi sono stabilito nel frattempo. Ho appena inviato il token. Ma preferibilmente, vorrei essere in grado di generarlo nel webjob. Sto generando il token e inviando l'e-mail in risposta a un evento, dopotutto. – Korijn

risposta

15

Dando uno sguardo al codice sorgente per il KatanaOWIN startup context si può vedere l'implementazione predefinita del DataProtectionProvider è un MachineKeyDataProtectionProvider. Purtroppo questa classe non è esposta a noi, solo il DpapiDataProtectionProvider che non funzionerà quando hosted in azure.

È possibile trovare l'implementazione dello MachineKeyDataProtectionProviderhere. Sarà necessario implementare anche il proprio MachineKeyDataProtector come visto here. Queste non sono implacazioni difficili e sono essenzialmente involucri intorno a MachineKey.Protect() e MachineKey.Unprotect().

l'implementazione per MachineKeyDataProtectionProvider e MachineKeyDataProtector dalla sorgente Katana progetto (apache 2.0 license):

internal class MachineKeyProtectionProvider : IDataProtectionProvider 
{ 
    public IDataProtector Create(params string[] purposes) 
    { 
     return new MachineKeyDataProtector(purposes); 
    } 
} 

internal class MachineKeyDataProtector : IDataProtector 
{ 
    private readonly string[] _purposes; 

    public MachineKeyDataProtector(string[] purposes) 
    { 
     _purposes = purposes; 
    } 

    public byte[] Protect(byte[] userData) 
    { 
     return MachineKey.Protect(userData, _purposes); 
    } 

    public byte[] Unprotect(byte[] protectedData) 
    { 
     return MachineKey.Unprotect(protectedData, _purposes); 
    } 
} 

Una volta che implementato è facile da inserire nella UserManager:

var usermanager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>()); 
var machineKeyProtectionProvider = new MachineKeyProtectionProvider(); 
usermanager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(machineKeyProtectionProvider.Create("ASP.NET Identity")); 

Speranza che aiuta mettiti nella giusta direzione.

+1

Questo funziona .. tipo di. Tuttavia, poiché il 'MachineKeyDataProtector' viene utilizzato al di fuori dell'app Web (nel lavoro Web), utilizza le proprie chiavi (non quelle che potrebbero essere speficate nel web.config dell'applicazione web). Quindi qualsiasi token che generi qui non sarà accettato come valido dall'app web :(Non sono sicuro di una soluzione a questo oltre a rotolare un IDataProtector diverso .... –

+0

@MattRoberts Hai trovato qualche soluzione a questo? –

Problemi correlati