【发布时间】:2019-05-27 10:46:17
【问题描述】:
我有一个现有的应用程序,它使用机器密钥方法生成 owin 身份令牌。相同的令牌用于验证各种应用程序。其中一个应用程序现在位于 asp.net 核心中。有没有办法在 asp.net core 中使用相同的 owin 生成的身份令牌?
或者我们可以在 asp.net core 中手动解码该令牌
【问题讨论】:
我有一个现有的应用程序,它使用机器密钥方法生成 owin 身份令牌。相同的令牌用于验证各种应用程序。其中一个应用程序现在位于 asp.net 核心中。有没有办法在 asp.net core 中使用相同的 owin 生成的身份令牌?
或者我们可以在 asp.net core 中手动解码该令牌
【问题讨论】:
使用机器密钥时,您不能在 ASP.NET 和 ASP.NET Core 之间共享任何东西。能够解密由 ASP.NET 应用程序设置的 ASP.NET Core 中的某些内容的唯一方法是,如果 1) ASP.NET 应用程序利用数据保护提供程序 2) 数据保护提供程序密钥环被持久保存到文件系统或所有应用程序(ASP.NET 和 ASP.NET Core 等)可访问的网络位置,并且所有应用程序都使用相同的应用程序名称。
【讨论】:
您可以使用IDataProtector直接解密从授权码流返回的访问令牌。我们实现IDataProtector 接口并使用System.Web.Security.MachineKey.Unprotect method。
制作解密 OWIN 票证的辅助方法
private class MachineKeyProtector : IDataProtector
{
private readonly string[] _purpose =
{
typeof(OAuthAuthorizationServerMiddleware).Namespace,
"Access_Token",
"v1"
};
public byte[] Protect(byte[] userData)
{
//throw new NotImplementedException();
}
public byte[] Unprotect(byte[] protectedData)
{
return System.Web.Security.MachineKey.Unprotect(protectedData, _purpose);
}
}
获取 ClaimsIdentity 和属性字典。我们只需创建一个实例并传入 Token 即可获取解密后的 Ticket
var secureDataFormat = new TicketDataFormat(new MachineKeyProtector());
AuthenticationTicket ticket = secureDataFormat.Unprotect(accessToken);
Above AuthenticationTicket 本身包含 ClaimsIdentity 和属性字典。 参考IDataProtector Interface
【讨论】: