我在Azure辅助角色中托管了一个Owin WebAPI服务器 Owin Authentication中间件似乎使用MachineKey来加密和生成令牌。 当我只有一个这个角色的实例时,这很有效,但是一旦我想使用多个实例,每个实例生成的标记就是不同的。
这与Web场相同,Azure为WebRoles使用相同的.net机器密钥自动解决了这个问题。
但这对于工作者角色实例不起作用。
是否有一个技巧让Azure使用相同的机器密钥来处理工作者角色的所有内容?
似乎比重写代码更容易为Owin生成令牌。
答案 0 :(得分:4)
如果您的自托管应用可以引用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(),
};