使用 OWIN 从 asp.net 核心发出的 oAuth 承载
consuming oAuth bearer issued by OWIN from asp.net core
我有 ASP.NET 4.5 服务和 OWIN 管道,它发布 OAuth access_token 以换取 username/password。此服务从 ng-app 调用,一旦它获得令牌,就会存储在浏览器的本地存储中。然后它调用资源 api 消耗这个令牌,API 也是写在 asp.net 4.5 中并使用 owin。这是与 OWIN 一起发布的 OAuth 令牌,它是 machineKey 机密的 encrypted/signed - 到目前为止一切顺利,并且很高兴被资源 API 使用。 OAuthAuthorizationServerMiddleware 使这一切成为可能。
现在我需要使用从相同的 ng-app 发送到 asp.net 核心 2.1 服务的这些令牌,没什么特别的,只是 verify/decode 它并在令牌中获取声明。
这个 OAuthAuthorizationServerMiddleware 从未移植到 asp.net 核心,所以我被卡住了。 ( 无助于谈论 full-fledged oidc 服务器我只需要使用它们 w/o 更改发布代码)
在 ConfigureServices() 中附加到 service.AddAuthentication():
Tried.AddJwtBearer - 但这没有意义 - 这些真的不是 Jwt 令牌
Tried.AddOAuth 但这也没有意义 b/c 我没有处理带有重定向的完整 OAuth 流程以获得令牌,我也没有处理 ClientId/ClientSecret/etc,我只是收到 "Bearer token-here" 在来自 ng 应用程序的 HTTP header 中,所以我需要管道中的一些东西来解码它并设置 ClaimsIdentity 但是这个 "something in the pipeline" 还需要访问相同的 machinery-like 数据因为它在 asp.net 4.5 OWIN 服务中
有什么想法吗?
您可以将 OAuthValidation AccessTokenFormat 设置为使用 MachineKey DataProtectionProvider 和 DataProtector,它们将保护和取消保护您的不记名令牌。您将需要实施 MachineKey DataProtector。这家伙已经做到了 https://github.com/daixinkai/AspNetCore.Owin/blob/master/src/DataProtection/src/AspNetCore.DataProtection.MachineKey/MachineKeyDataProtectionProvider.cs.
public void ConfigureServices(IServiceCollection services){
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
ConfigureAuth(services);
string machineKey = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<machineKey decryption=""Auto"" decryptionKey =""DEC_KEY"" validation=""HMACSHA256"" validationKey=""VAL_KEY"" />";
var machineKeyConfig = new XmlMachineKeyConfig(machineKey);
MachineKeyDataProtectionOptions machinekeyOptions = new MachineKeyDataProtectionOptions();
machinekeyOptions.MachineKey = new MachineKey(machineKeyConfig);
MachineKeyDataProtectionProvider machineKeyDataProtectionProvider = new MachineKeyDataProtectionProvider(machinekeyOptions);
MachineKeyDataProtector machineKeyDataProtector = new MachineKeyDataProtector(machinekeyOptions.MachineKey);
//purposes from owin middleware
IDataProtector dataProtector =
machineKeyDataProtector.CreateProtector("Microsoft.Owin.Security.OAuth",
"Access_Token", "v1");
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddOAuthValidation(option=> {
option.AccessTokenFormat = new OwinTicketDataFormat(new OwinTicketSerializer(), dataProtector); })
保持 Owin 在 OAuthAuthorizationServerMiddleware 中使用的相同 DataProtector "purposes" 很重要,因此数据 encrypted/decrypted 正确。它们是 "Microsoft.Owin.Security.OAuth"、"Access_Token" 和 "v1"。 (参见 )。
最后您将不得不迁移 Owin TicketSerializer(可能还有 TicketFormat),因为 NetCore 中的稍微不同。你可以从这里获取它:
我最近开始工作了。基本上使用相同的令牌对 .NET 4.5 Owin API 和 运行 NET Core 中的资源 API 进行身份验证。我会尽快在 github 中分享代码。
据我所知,不建议保留旧的机器密钥数据保护器,而是从 NET Core 迁移到新的。有时这是不可能的。在我的例子中,我已经有太多 API 投入生产,所以我正在尝试一些新的 NET Core API 来处理旧的。
您应该试试这个 Owin.Token.AspNetCore nuget 包。通过遵循 README 文件中提供的代码示例,我能够使用 .NET Core 3.1 上的机器密钥解码遗留令牌。注意:如果默认设置不适合您,还有一个选项可以指定加密方法和验证方法。
我有 ASP.NET 4.5 服务和 OWIN 管道,它发布 OAuth access_token 以换取 username/password。此服务从 ng-app 调用,一旦它获得令牌,就会存储在浏览器的本地存储中。然后它调用资源 api 消耗这个令牌,API 也是写在 asp.net 4.5 中并使用 owin。这是与 OWIN 一起发布的 OAuth 令牌,它是 machineKey 机密的 encrypted/signed - 到目前为止一切顺利,并且很高兴被资源 API 使用。 OAuthAuthorizationServerMiddleware 使这一切成为可能。
现在我需要使用从相同的 ng-app 发送到 asp.net 核心 2.1 服务的这些令牌,没什么特别的,只是 verify/decode 它并在令牌中获取声明。
这个 OAuthAuthorizationServerMiddleware 从未移植到 asp.net 核心,所以我被卡住了。 (
您可以将 OAuthValidation AccessTokenFormat 设置为使用 MachineKey DataProtectionProvider 和 DataProtector,它们将保护和取消保护您的不记名令牌。您将需要实施 MachineKey DataProtector。这家伙已经做到了 https://github.com/daixinkai/AspNetCore.Owin/blob/master/src/DataProtection/src/AspNetCore.DataProtection.MachineKey/MachineKeyDataProtectionProvider.cs.
public void ConfigureServices(IServiceCollection services){
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
ConfigureAuth(services);
string machineKey = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<machineKey decryption=""Auto"" decryptionKey =""DEC_KEY"" validation=""HMACSHA256"" validationKey=""VAL_KEY"" />";
var machineKeyConfig = new XmlMachineKeyConfig(machineKey);
MachineKeyDataProtectionOptions machinekeyOptions = new MachineKeyDataProtectionOptions();
machinekeyOptions.MachineKey = new MachineKey(machineKeyConfig);
MachineKeyDataProtectionProvider machineKeyDataProtectionProvider = new MachineKeyDataProtectionProvider(machinekeyOptions);
MachineKeyDataProtector machineKeyDataProtector = new MachineKeyDataProtector(machinekeyOptions.MachineKey);
//purposes from owin middleware
IDataProtector dataProtector =
machineKeyDataProtector.CreateProtector("Microsoft.Owin.Security.OAuth",
"Access_Token", "v1");
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddOAuthValidation(option=> {
option.AccessTokenFormat = new OwinTicketDataFormat(new OwinTicketSerializer(), dataProtector); })
保持 Owin 在 OAuthAuthorizationServerMiddleware 中使用的相同 DataProtector "purposes" 很重要,因此数据 encrypted/decrypted 正确。它们是 "Microsoft.Owin.Security.OAuth"、"Access_Token" 和 "v1"。 (参见 )。
最后您将不得不迁移 Owin TicketSerializer(可能还有 TicketFormat),因为 NetCore 中的稍微不同。你可以从这里获取它:
我最近开始工作了。基本上使用相同的令牌对 .NET 4.5 Owin API 和 运行 NET Core 中的资源 API 进行身份验证。我会尽快在 github 中分享代码。
据我所知,不建议保留旧的机器密钥数据保护器,而是从 NET Core 迁移到新的。有时这是不可能的。在我的例子中,我已经有太多 API 投入生产,所以我正在尝试一些新的 NET Core API 来处理旧的。
您应该试试这个 Owin.Token.AspNetCore nuget 包。通过遵循 README 文件中提供的代码示例,我能够使用 .NET Core 3.1 上的机器密钥解码遗留令牌。注意:如果默认设置不适合您,还有一个选项可以指定加密方法和验证方法。