2014-01-09 55 views
4

我曾經在Azure工作者角色中託管過Owin WebAPI服務器。
歐文身份驗證中間件似乎使用MachineKey來加密和生成令牌。 當我只有這個角色的一個實例時,這是完美的,但只要我想使用多個實例,每個實例生成的令牌都是不同的。是否可以爲Azure工作者角色設置機器密鑰

這與網上服務器場的問題相同,Azure使用與Web.config中的所有實例相同的.net機器密鑰自動解決此問題。

但是這對於工作者角色實例不起作用。

Azure使用相同的機器密鑰處理worker角色的所有配置是否有竅門?

似乎它會比重寫代碼來爲Owin生成標記更容易。

+1

如何只手動設置你的應用程序配置文件本機鍵?它在傳統的Web角色中運行得非常好,也不會對工作者角色產生任何問題。我重複 - 在配置中手動設置密鑰,不要依靠自動配置! – astaykov

+0

感謝您的回答,但App.config不支持設置機器設置爲Web.config ... –

+0

和什麼阻止你有'system.web \ machineKey'部分在你的app.config文件?你在回答之前嘗試過嗎? – astaykov

回答

3

如果您的自託管應用程序可以引用System.Web,那麼您可以使用與Microsoft.Owin.Host.SystemWeb相同的MachineKey實現。

configuration/system.web/machineKey設置放入您的App.config中,就像它在Web.config中一樣。

參考參考System.Web並添加以下類:

public class MachineKeyDataProtector : IDataProtector 
{ 
    private readonly string[] purposes; 

    public MachineKeyDataProtector(params string[] purposes) 
    { 
     this.purposes = purposes; 
    } 

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

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

使用該類然後設置您的身份驗證選項:

 var authenticationOptions = new OAuthBearerAuthenticationOptions 
            { 
             AccessTokenFormat = new TicketDataFormat(new MachineKeyDataProtector(
              typeof(OAuthBearerAuthenticationMiddleware).Namespace, "Access_Token", "v1")), 
             AccessTokenProvider = new AuthenticationTokenProvider(), 
            }; 
相關問題