2015-02-19 21 views
13

Tôi cần một thể hiện của IDataProtectionProvider để tạo ra thẻ xác nhận email bằng cách sử dụng nhận dạng khung UserManager trong một nhân viên Azure Jobs Web:Làm thế nào tôi có thể khởi tạo OWIN IDataProtectionProvider trong Azure Web Jobs?

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

này bị treo vì một null IUserTokenProvider<User, int> đã được thông qua với UserManager<User, int> khi constuction.

Trong ứng dụng MVC một thể hiện được tạo ra như thế này:

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

Nhưng tất nhiên, Azure Jobs Web không có móc OWINStartup. Lời khuyên nào?

+0

Bạn có thể gửi thông tin cần thiết để tạo mã thông báo trong hàng đợi. Và sử dụng thông điệp đó trong WebJob của bạn để làm những gì cần thiết. – lopezbertoni

+0

Vâng, đó là những gì tôi đã giải quyết trong thời gian chờ đợi. Tôi chỉ cần gửi các mã thông báo cùng. Nhưng tốt nhất là tôi muốn có thể tạo ra nó trong webjob. Tôi đang tạo ra các mã thông báo và gửi email để đáp ứng với một sự kiện, sau khi tất cả. – Korijn

Trả lời

15

Hãy xem mã nguồn Katana cho số OWIN startup context bạn có thể thấy triển khai mặc định của DataProtectionProviderMachineKeyDataProtectionProvider. Thật không may lớp này không được tiếp xúc với chúng tôi, chỉ có DpapiDataProtectionProvider sẽ không hoạt động khi hosted in azure.

Bạn có thể tìm thấy việc triển khai MachineKeyDataProtectionProviderhere. Bạn cũng cần phải triển khai MachineKeyDataProtector của riêng mình như được thấy here. Đây không phải là những điều khó khăn và về cơ bản là các trình bao bọc xung quanh MachineKey.Protect()MachineKey.Unprotect().

Việc thực hiện cho MachineKeyDataProtectionProviderMachineKeyDataProtector từ nguồn dự án Katana (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); 
    } 
} 

Một khi bạn đã có thực hiện nó rất dễ dàng để cắm vào các UserManager:

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

Hy vọng rằng sẽ giúp giúp bạn đi đúng hướng.

+1

Điều này làm việc .. loại. Tuy nhiên, vì 'MachineKeyDataProtector' đang được sử dụng bên ngoài ứng dụng web (trong công việc web), nó sử dụng các khóa riêng của nó (không phải bất kỳ phím nào bạn có thể thích hợp trong web.config của ứng dụng web). Vì vậy, bất kỳ dấu hiệu bạn tạo ra ở đây sẽ không sau đó được chấp nhận là hợp lệ bởi các ứng dụng web :(Không chắc chắn về một giải pháp này ngoài việc lăn một IDataProtector khác nhau .... –

+0

@MattRoberts Bạn có tìm thấy bất kỳ giải pháp này? –

Các vấn đề liên quan