我正在尝试将我的auth资源迁移到Core 2.0并使用我自己的身份验证方案出现问题.我在启动时的服务设置如下所示:
var authenticationBuilder = services.AddAuthentication(options =>
{
options.AddScheme("myauth", builder =>
{
builder.HandlerType = typeof(CookieAuthenticationHandler);
});
})
.AddCookie();
Run Code Online (Sandbox Code Playgroud)
我在控制器中的登录代码如下所示:
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, user.Name)
};
var props = new AuthenticationProperties
{
IsPersistent = persistCookie,
ExpiresUtc = DateTime.UtcNow.AddYears(1)
};
var id = new ClaimsIdentity(claims);
await HttpContext.SignInAsync("myauth", new ClaimsPrincipal(id), props);
Run Code Online (Sandbox Code Playgroud)
但是当我在控制器或动作过滤器中时,我只有一个身份,而且它不是经过身份验证的身份:
var identity = context.HttpContext.User.Identities.SingleOrDefault(x => x.AuthenticationType == "myauth");
Run Code Online (Sandbox Code Playgroud)
导航这些变化一直很困难,但我猜我正在做.AddScheme错了.有什么建议?
编辑:这里(基本上)是一个干净的应用程序,不会在User.Identies上产生两组身份:
namespace WebApplication1.Controllers
{
public class Testy : Controller
{
public IActionResult Index()
{
var i = HttpContext.User.Identities; …Run Code Online (Sandbox Code Playgroud) 请帮助我了解来自 ASP netcore 应用程序和 netcore Kestrel 托管应用程序的 JWT 令牌验证之间的区别。
有两个应用程序使用如下源代码验证令牌:
public static IServiceCollection AddJwtToken(this IServiceCollection services, OAuthConfig config)
{
services.AddMvc();
services.AddAuthorization();
Logger.DebugFormat("AddJwtBearer authority:{0} audience:{1}", config.GetAuthority(), config.Resource);
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => new JwtBearerOptions
{
Authority = config.GetAuthority(),
Audience = config.Resource,
});
return services;
}
Run Code Online (Sandbox Code Playgroud)
它非常简单,如果从 asp net core 2.2 应用程序验证令牌,它就可以很好地工作
// in the asp.net core
var builder = WebHost.CreateDefaultBuilder(args);
builder
.UseStartup<Startup>()
.ConfigureKestrel(_ => _.ConfigureEndpoints())
.UseSerilog();
Run Code Online (Sandbox Code Playgroud)
还有另一个应用程序(控制台)使用 UseKestrel
//in the console app
var builder = WebHost.CreateDefaultBuilder()
.UseNLog()
.UseKestrel(_ => _.ConfigureEndpoints())
.UseStartup<Startup>();
Run Code Online (Sandbox Code Playgroud)
唯一的一个显着区别是UseKestrel …
有没有办法在单个 asp.net core 2.0 应用程序中处理来自多个颁发者的 JWT?
这是我目前检查令牌的方式:
public void ConfigureServices(IServiceCollection services)
{
TokenValidationParameters tokenValidationParameters = new TokenValidationParameters
{
// ...
ValidateIssuer = true,
ValidIssuer = options.Issuer, // <-- could this be a list of issuers?
// ...
};
services.AddAuthentication()
.AddJwtBearer(jwtOptions =>
{
jwtOptions.TokenValidationParameters = tokenValidationParameters;
});
services.AddAuthorization(authOptions =>
{
authOptions.DefaultPolicy = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme).RequireAuthenticatedUser().Build();
});
}
public void Configure(IApplicationBuilder app)
{
// ...
app.UseAuthentication();
}
Run Code Online (Sandbox Code Playgroud)
我之所以要处理多个颁发者,是因为我需要处理具有不同权限的不同用户类型。为了在微服务架构环境中只允许特定用户使用某些服务,我想为每个用户类型使用不同的发行者发行令牌。
处理使用Firebase进行某些数据存储的项目,我们的客户端请求使用C#.NET实现服务器.我们在服务器上设置REST端点,以便客户端能够出于某些目的与其进行通信(例如,触发只能在服务器上运行的算法).
Firebase建议我们通过ID令牌识别用户,如下所示:https://firebase.google.com/docs/auth/server/verify-id-tokens#verify_id_tokens_using_a_third-party_jwt_library
由于没有支持令牌身份验证的官方.NET Firebase服务器SDK,因此我们使用第三方JWT库来执行此操作:https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for -dotnet
根据Firebase文档中的规定,我们首先生成向服务器发送令牌.在检查令牌中的几个不同字段后,我们使用该kid字段从https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com获取公钥.
我们一直在浏览文档和StackOverflow很长一段时间,但是根据Firebase文档的规定,我们找不到使用此公钥来执行此操作的方法:
最后,确保ID令牌由与令牌的孩子声明相对应的私钥签名.从https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com获取公钥,并使用JWT库验证签名.
Firebase文档实际上没有为此提供任何解释,我们正在使用的库的文档也没有.因此,当我们给出的所有内容都是公钥时,我们甚至无法获得关于如何验证令牌是否由私钥签名的基本想法.
验证令牌是否由正确的私钥实际签名的最佳方法是什么?
我们正在开发一种 API,它允许用户通过许多不同的提供商进行身份验证。单独的提供程序不是问题,但事实证明将它们一起使用是一个挑战。
InvalidOperationException当应用程序启动时,似乎添加 1 个以上的提供者会抛出“方案已经存在:承载”。
下面是ConfigureServices函数来自Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "Value";
options.Audience = "Value";
})
.AddMicrosoftIdentityWebApi(options =>
{
Configuration.Bind("AzureAdB2C", options);
options.TokenValidationParameters.NameClaimType = "name";
},
options => { Configuration.Bind("AzureAdB2C", options); });
services.AddControllers();
services.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder(
JwtBearerDefaults.AuthenticationScheme)
.RequireAuthenticatedUser()
.Build();
});
}
Run Code Online (Sandbox Code Playgroud)
我使用 Microsoft 示例对 Azure AD 进行身份验证作为起点。删除AddJwtBearerorAddMicrosoftIdentityWebApi调用工作正常,但我需要为我们的用例配置两个提供程序。
有没有办法在 .NET Core 3.1 或更高版本上做到这一点?
请参阅下面的更新
我正在使用 Azure AD B2C,希望我的用户能够通过我的 Web 应用程序登录,并能够利用 JWT 不记名令牌并从移动应用程序调用 Web API 方法。
我可以让任一身份验证方案自行工作。例如,在我的startup.cs中我可以执行以下操作:
services
.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
.AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options));
Run Code Online (Sandbox Code Playgroud)
其按预期工作(用户可以登录网站,但 JWT 不起作用)。
或者,我可以使用以下内容,然后只有 JWT 不记名令牌才可以工作:
services
.AddAuthentication(AzureADB2CDefaults.JwtBearerAuthenticationScheme)
.AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));
Run Code Online (Sandbox Code Playgroud)
如果我想要其中任何一个工作,我可以执行以下操作(在/sf/answers/3479447331/的帮助下)
services
.AddAuthentication()
.AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options))
.AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));
services.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes(AzureADB2CDefaults.AuthenticationScheme, AzureADB2CDefaults.JwtBearerAuthenticationScheme)
.Build();
}
Run Code Online (Sandbox Code Playgroud)
现在两者都可以工作。(编辑:实际上,它们并不能完全工作)
但是,我也有这个代码:
app.UseAuthentication();
app.UseMiddleware<MyAfterAuthenticatedMiddleware>();
app.UseAuthorization();
Run Code Online (Sandbox Code Playgroud)
问题是,当我使用任一身份验证的组合时,当我的中间件代码运行时,我的用户未经过身份验证(在中间件代码中)并且没有声明等,但稍后在管道中获取它们。
这里发生了什么事?如何解决这个问题?
看来,当我不指定默认身份验证方案时(为了拥有多个方案),直到管道中的授权步骤时,身份验证才会发生。
我需要我的中间件在身份验证之后和授权之前运行。如何通过多种身份验证方案实现这一点?
更新——解决了!但一定有更好的方法!
首先,我要向那些创建 .NET 安全产品的人们表示敬意。这很重要,也很困难。但我确实认为可能还有很大的改进空间。
大多数开发人员在必要时都会涉足安全领域,然后又回到他们的“常规”工作中。除非你每天都使用它,否则很难保持领先。每次你回到它时,一切都会再次改变。
这一定是一个常见的场景:我希望我的用户能够登录我的网站并与各种 Web API 方法进行交互。我希望他们也能够通过其他方式访问这些相同的 API …
是否可以使用内置的身份验证/授权选项来保护 Azure 应用服务中的 Web API,同时使用 OAuth 客户端凭据授予流程来访问它?
我有一个应用程序服务正在使用 Azure AD B2C 进行身份验证。在该 B2C 租户中,我注册了 Web 应用程序/API,并且身份验证工作正常,可以使用该 Web 应用程序。我在该 AD B2C 应用程序的“已发布范围”部分中添加了一个范围,并为该范围添加了一个应用程序 ID URI。然后我在租户中创建了另一个应用程序 (ClientApp) 来代表我想要提供对第一个 API 的访问的另一个服务。我为其生成了一个密钥,并且还在 API 访问部分添加了我在其他应用程序中创建的范围。
然后在邮递员中我使用下一个获取令牌
我成功获取了令牌,但是当我尝试使用邮递员使用不记名令牌访问网站时,我只得到 401。
我有一个用于 SSO 的 .NET Core IdentityServer (IS),我想用它来验证我的 .NET Core(后端)-Angular(客户端)应用程序。我想通过自定义后端生成的 JWT 令牌在后端有一个 EF ApplicationUser 并在后端有基于 Claim 的授权,该令牌也适用于客户端的授权。
在后端,我创建了一个中间件来检查所有请求的“授权”标头。如果标头包含由 IS 生成的令牌,我想将其交换为包含必要声明的自定义(后端)生成的令牌。客户端然后将此标头用于对后端的后续请求。
启动配置:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMiddleware<AuthorizationHeaderMiddleware>();
app.UseAuthentication();
app.UseStaticFiles();
app.UseMvc();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(DEFAULT_AUTH_SCHEME)
.AddJwtBearer(DEFAULT_AUTH_SCHEME, cfg =>
{
cfg.Audience = Configuration["Authorization:JwtIssuer"];
cfg.RequireHttpsMetadata = false;
cfg.TokenValidationParameters = new TokenValidationParameters
{
RequireSignedTokens = false,
ValidateIssuer = false,
ValidateLifetime = false,
ValidateIssuerSigningKey = false,
ValidIssuer = Configuration["Authorization:JwtIssuer"],
ValidAudience = Configuration["Authorization:JwtIssuer"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Authorization:JwtKey"])),
RequireExpirationTime = false,
ClockSkew = …Run Code Online (Sandbox Code Playgroud) 有没有办法在 .net core 中使用 JWT 承载身份验证和自定义身份验证方法?我希望所有操作都默认为 JWT,但在少数情况下我想使用自定义身份验证标头。
asp.net-core ×6
c# ×5
jwt ×4
azure-ad-b2c ×3
.net-core ×1
asp.net ×1
asp.net-mvc ×1
azure ×1
firebase ×1
openid ×1