asp.net - 在 Asp Net Core 应用程序中使用现有的 Asp Net Framework 机器密钥
问题描述
我在 Web.config 中几乎没有使用 Net.Framework 共享相同的工作 ASP NET 应用程序machineKey
,因此当用户在一个应用程序中进行身份验证时,其他应用程序也认为他已通过身份验证。
现在我必须将一个新的应用程序连接到这个使用 asp net Core 2.0 的俱乐部。是否有关于如何转换现有“遗留”的快速解决方案
<system.web>
...
<machineKey decryption="AES" decryptionKey="blablabla" validation="SHA1" validationKey="blablabla" />
</system.web>
要在核心应用程序中使用?
编辑:实际的 Net.Framework api 使用基于令牌的身份验证:
using Microsoft.Owin;
using Microsoft.Owin.Security.OAuth;
private void ConfigureOAuth(IAppBuilder app)
{
OAuthBearerOptions = new OAuthBearerAuthenticationOptions();
//Token consumption from header "Authentication Bearer"
app.UseOAuthBearerAuthentication(OAuthBearerOptions);
}
然后在[Authorize]
框架上使用机器密钥解码令牌。我猜正确的问题是如何在 Core 2.0+ 中使用手动提供的机器密钥来解密在标头中发送的身份验证令牌。
解决方案
您可以为此目的使用很棒的库AspNetTicketBridge。
令牌处理程序定义:
public class OwinBearerTokenMachineKeyAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
public const string DefaultAuthScheme = "DefaultAuth";
// List of supported decryption algorithms: DES | 3DES | AES
private const string DefaultDecryptionAlgorithm = "<YOUR DECRYPTION ALGORIGHM>";
// List of supported validation algorithms: SHA1 | MD5 | 3DES | AES | HMACSHA256 | HMACSHA384 | HMACSHA512
private const string DefaultValidationAlgorithm = "<YOUR VALIDATION ALGORITHM>";
private const string DefaultAuthorizationHeader = "Authorization";
public OwinBearerTokenMachineKeyAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
{
}
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
var token = Request.Headers[DefaultAuthorizationHeader][0].Remove(0, 7); // Bad code, don't use it... please
// Get keys from machine keys section / another configuration file.
var validationKey = "<YOUR VALIDATION KEY FROM MACHINE KEY CONFIG>";
var decryptionKey = "<YOUR DECRYPTION KEY FROM MACHINE KEY CONFIG>";
var ticket = MachineKeyTicketUnprotector.UnprotectOAuthToken(token, decryptionKey, validationKey, DefaultDecryptionAlgorithm, DefaultValidationAlgorithm);
var newTicket = AuthenticationTicketConverter.Convert(ticket, DefaultAuthScheme);
return Task.FromResult(AuthenticateResult.Success(newTicket));
}
}
应用配置:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
app.UseAuthentication();
app.UseAuthorization(); // Gives ability to use [Authorize] attribute
// ...
}
public void ConfigureServices(IServiceCollection services)
{
// ...
RegisterAuthorization(services);
// ...
}
private void RegisterAuthorization(IServiceCollection services)
{
services.AddAuthentication(o => { o.DefaultScheme = OwinBearerTokenMachineKeyAuthenticationHandler.DefaultAuthScheme; })
.AddScheme<AuthenticationSchemeOptions, OwinBearerTokenMachineKeyAuthenticationHandler>(OwinBearerTokenMachineKeyAuthenticationHandler.DefaultAuthScheme, o => { });
services.AddAuthorization(); // Gives ability to use [Authorize] attribute
}
PS 我花了 2 天时间寻找完成这项任务的好解决方案,但只有这似乎是最好的。
推荐阅读
- informatica - 在我的映射中,我有两个过滤器转换和两个目标表,但是将数据写入第一个目标和第二个目标的目标对象是空的
- hibernate - 如何使用休眠搜索填充 Elasticsearch
- python - 来自导入的 Python 包的语法错误
- ios - iOS - 错误消息“设备上没有剩余空间”
- excel - Excel 插件无法在 Apple 的硅 M1 处理器机器上运行
- jquery - 动画未完成时,Anime.js svg morph 动画悬停不反转
- api - BigCartel - 显示可供购买的数量
- firebase - 我可以使用 fcm 向其他用户发送推送通知吗?
- python - 如何从不同的 txt 文件在 matplotlib 中同时制作几个动画图
- java - Drools 决策表动作执行顺序