我们有 ASP.NET MVC 5.x WebAPI 2.x Web 应用程序作为 Azure 云服务运行,并使用 token 授权对我们的服务进行 REST API 调用。
问题是:每次我们重新部署应用程序时,所有当前 token 都会变得无效(服务器对任何请求返回“未经授权”的响应)。
问题是:为什么会发生这种情况以及如何防止这种行为?
更新: 这是颁发 token 的代码:
public string GetOAuthToken(IUser user) {
if (user != null) {
var identity = new ClaimsIdentity(Startup.OAuthOptions.AuthenticationType);
identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id));
AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
var currentUtc = DateTime.UtcNow;
ticket.Properties.IssuedUtc = currentUtc;
ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromDays(36600)); //About 100 years
string AccessToken = Startup.OAuthOptions.AccessTokenFormat.Protect(ticket);
return AccessToken;
}
return "";
}
更新2: 看来默认 token 端点(/Token)生成的 token 在重新部署后不会变得无效 - 所以问题(我认为)出在我们为“手工制作” token 设置的某些属性中。 在哪里可以找到创建默认 token (由/Token 端点返回)的代码?
最佳答案
问题已解决。 看来默认创建的 AccessTokenFormat 使用 machineKey 来生成 token 。显然,这些 key 对于生产虚拟机和临时虚拟机来说是不同的。 解决方案相当简单。您需要生成自己的机器 key 并将其添加到项目的 Web.Config 文件中:
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" relaxedUrlToFileSystemMapping="true" />
<machineKey
validationKey="YOUR VALIDATION KEY GOES HERE"
decryptionKey="YOUR DECRYPTION KEY GOES HERE"
validation="SHA1" decryption="AES"
/>
有关此方法的更多信息,您可以阅读本文的“第 5 步...”部分: http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/
关于asp.net - 重新部署后不记名 token 失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31205021/