2015-02-19 10 views
13

Ich brauche eine Instanz von IDataProtectionProvider zu E-Mail-Bestätigung-Token mit dem Identity-Framework UserManager in ein Azure Web Jobs Arbeiter zu erzeugen:Wie kann ich OWIN IDataProtectionProvider in Azure Web Jobs instanziieren?

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

Dies stürzt, weil ein Null IUserTokenProvider<User, int> zum UserManager<User, int> auf constuction übergeben wurde.

In der MVC-Anwendung eine Instanz wie folgt erstellt:

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

Aber natürlich ist Azure Web Jobs einen OWINStartup Haken nicht haben. Irgendein Rat?

+0

Sie können die Informationen senden, die zum Generieren des Tokens in einer Warteschlangennachricht benötigt werden. Und verwenden Sie diese Nachricht in Ihrem WebJob, um zu tun, was benötigt wird. – lopezbertoni

+0

Ja, dafür habe ich mich inzwischen entschieden. Ich schicke den Token einfach mit. Aber am liebsten möchte ich es im Webjob erzeugen können. Ich erzeuge das Token und sende die E-Mail als Antwort auf ein Ereignis. – Korijn

Antwort

15

einen Blick auf die Katana Quellcode nehmen für die OWIN startup context Sie die Standardimplementierung des DataProtectionProvider sehen ein MachineKeyDataProtectionProvider ist. Leider ist diese Klasse uns nicht ausgesetzt, nur die DpapiDataProtectionProvider die nicht funktioniert wenn hosted in azure.

Sie können die Implementierung des MachineKeyDataProtectionProviderhere finden. Sie müssen auch Ihre eigenen MachineKeyDataProtector wie gesehen here implementieren. Dies sind keine schwierigen Implementierungen und sind im Wesentlichen Umhüllungen um MachineKey.Protect() und MachineKey.Unprotect().

Die Implementierung für MachineKeyDataProtectionProvider und MachineKeyDataProtector vom Katana Projekt Quelle (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); 
    } 
} 

Sobald Sie, dass es einfach zu implementieren Stecker in die UserManager:

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

Hoffnung, die hilft bringen Sie in die richtige Richtung.

+1

Das funktioniert .. Art von. Aber da der 'MachineKeyDataProtector' außerhalb der Web-App (im Web-Job) verwendet wird, verwendet er seine eigenen Schlüssel (nicht die, die Sie in der web.config der Web-App angeben könnten). Daher wird jedes Token, das Sie hier erzeugen, von der Web-App nicht als gültig akzeptiert :(Ich bin mir nicht sicher, dass es eine Lösung dafür gibt, abgesehen von einem anderen IDataProtector .... –

+0

@MattRoberts Haben Sie eine Lösung gefunden? –

Verwandte Themen