- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
将 .NET Core 1 Web 项目中的 api 端点剥离到仅 .NET Core 2 api 项目。我对身份验证(-orization 和 -entication)的经验充其量是最少的,主要是因为我参与的大多数项目已经设置了身份验证和/或它是 AD 环境。
网站的 API 部分使用预共享 token 包含在每个请求的 header 中。该 token 是所有身份验证、用户识别、权限等的关键。用户信息(即您是谁以及您可以做什么)包含在自定义 CurrentContext
类中。
Core 1 项目使用中间件 (ContextMiddleware
) 来初始化在 DI 中注册为范围
的 CurrentContext
实例。当调用 ContextMiddleware 类时,自定义身份验证处理程序已被调用,必要的 header token 已被检查,身份验证检查已通过,并且主体已创建。因此,很大程度上依赖于现有主体的 ContextMiddleware 类可以构建 CurrentContext 以及了解谁在调用所需的大量信息。
Core 2 项目最终在身份验证处理程序之前运行 ContextMiddleware
,但我不知道如何强制这两个项目交换顺序。
相关代码片段:
public class Startup {
public void ConfigureServices(IServiceCollection services) {
// ...
// https://geeklearning.io/how-to-migrate-your-authentication-middleware-to-asp-net-core-2-0/
services.AddAuthentication( options =>
{
options.DefaultScheme = UserTokenAuthenticationDefaults.AuthenticationScheme;
} ).AddUserTokenAuthentication(UserTokenAuthenticationDefaults.AuthenticationScheme,
UserTokenAuthenticationDefaults.AuthenticationScheme,
o => { } );
// ...
}
public void Configure(IApplicationBuilder app /*...*/) {
if (env.IsDevelopment()){
app.UseDeveloperExceptionPage();
} else {
app.UseExceptionHandler("/error/500");
}
app.UseStaticFiles();
app.UseAuthentication();
app.UseMiddleware<ContextMiddleware>();
app.UseMvc();
}
}
如果需要更多代码片段来获取更多信息,请告诉我。如何强制我的身份验证处理程序的 HandleAuthenticateAsync() 在调用 ContextMiddleware
之前运行?
最佳答案
我也正在处理这个问题,我们发现最好支持我们制定的“动态”身份验证方案,然后允许调用选择器来做出身份验证类型决策。
根据 ASP.NET Core 标准在代码库中的某个位置添加一个 DynamicAuthenticationDefaults.AuthenticationScheme = "Dynamic";
常量,然后在启动类的 ConfigureServices
中添加动态方案:
.AddAuthentication( options =>
{
options.DefaultScheme = DynamicAuthenticationDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = DynamicAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = DynamicAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = DynamicAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignOutScheme = DynamicAuthenticationDefaults.AuthenticationScheme;
} )
.AddYourCustomAuthentication( YourCustomAuthenticationDefaults.AuthenticationScheme, YourCustomAuthenticationDefaults.AuthenticationScheme, options => { } )
.AddPolicyScheme( DynamicAuthenticationDefaults.AuthenticationScheme, DynamicAuthenticationDefaults.AuthenticationScheme, options =>
{
options.ForwardDefaultSelector = DynamicAuthenticationSchemaSelector.Evaluate;
} );
然后在自定义 DynamicAuthenticationSchemaSelector
类中实现该评估方法:
public static class DynamicAuthenticationSchemaSelector
{
public static string Evaluate( HttpContext context )
{
string result;
var authHeader = context.Request.Headers["Authorization"].FirstOrDefault();
if( !string.IsNullOrEmpty( authHeader ) && authHeader.StartsWith( YourCustomAuthenticationDefaults.AuthenticationScheme ) )
{
result = YourCustomAuthenticationDefaults.AuthenticationScheme;
}
else
{
result = IdentityConstants.ApplicationScheme;
}
return result;
}
}
您将获得正确的身份验证中间件处理。
您也不需要将其称为“动态”,它只是为了遵循最佳实践/模式 - 任何字符串就足够了。
关于asp.net-mvc - .NET核心2 : Force authentication handler to run before middleware?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52681294/
我正在尝试安装 webpymail ( https://code.google.com/p/webpymail/wiki/Installation ),我按照教程中的说明进行了所有操作,但是在启动该应
我已经创建了一个应该针对每个 请求运行的中间件,因此我将其添加到 Http\Kernel 的 $middleware 属性中。我还在这个中间件中使用了 Auth::check() ,所以我的中间件应该
我正在将使用 django_cms 的应用程序从一台服务器(一切正常)移动到另一台服务器,并在过去 4 小时内试图找出导致此错误的原因。非常欢迎提出建议! mod_wsgi (pid=21972):
示例代码可在 https://github.com/baumgarb/reverse-proxy-demo 上获得README.md 解释了如果您克隆存储库,如何重新产生问题。 我有一个 API 网关
长话短说,我有一个相当奇怪的路由场景,我需要在调用参数中间件之前调用中间件: router.param('foo', function (req, res, next, param) { // G
我在本地开发环境中没有这个问题,但我只是使用 nginx + gunicorn 部署了应用程序(第一次部署应用程序),每当我尝试发出请求时都会收到此回溯。 2012-01-21 22:24:36 [5
我在安装了 python 2.6.2 的 Ubuntu 9 上运行 Apache2。当我尝试访问 django 应用程序上的页面时出现以下错误: File "/usr/local/lib/python
我是 django 和 python 的新手,我试图在一段 django 代码上运行服务器,但我遇到了以下问题, Kinnovates-MacBook-Pro:platformsite Kinnova
我想澄清 config.ru 文件以指定 Rack 中间件,而不是使用 config.middleware 数组。 如果 config.ru 通常如下所示: require ::File.expand
我目前正在尝试用基于 express + webpack-middleware 的更强大的解决方案替换我使用 webpack-dev-server 的旧设置。所以我曾经像这样运行它:“webpack-
我开始使用带有 node/express 环境的 webpack 开发一个带有 react- 的 ReactJS 服务器端渲染应用程序路由器。我对每个 webpack 包在开发和生产(运行时)环境中的
我想为Guzzle写一个中间件它将特定的键添加到 form_params 并用值填充它。在我读过的文档中how to modify the headers但尚未找到有关 $request 对象其他属性
我目前正在研究各种中间件解决方案,这些解决方案将使我能够使用多种语言创建能够相互通信的应用程序。 ZeroC产品套件似乎是理想的选择,因为它提供了一种语言不可知的方式来定义数据和对数据进行操作的服务(
本文主要针对Golang的内置库 net/http 做了简单的扩展,通过添加中间件的形式实现了管道(Pipeline)模式,这样的好处是各模块之间是低耦合的,符合单一职责原则,可以很灵活的通过中间件
我有一个包含 url 的表单输入,我需要验证给定的 URL 没有被第 3 方 API 列入黑名单,我不确定是否需要使用 Middleware或创建特定表格 Request并在将该请求传递给命令之前验证
它说 The Slim Framework implements a version of the Rack protocol. As a result, a Slim application can
我想编写自己的中间件来检查当前用户是否是某个组的成员。如果是,用户可以移动到路由,如果不是,用户将被重定向到不同的页面。 我的中间件正在工作,但我不知道如何获取当前用户 ID。我试过 Auth::us
本文实例讲述了Django框架中间件(Middleware)用法。分享给大家供大家参考,具体如下: 1、面向切面编程 切点(钩子) 切点允许我们动态的在原有逻辑中插入一部分代码
我想做这样的事情: $app->mount('dashboard', new Travel\Controllers\Dashboard())->before(function() use ($app)
我正在尝试在我的reactjs应用程序中应用redux。由于这些错误,我无法继续: 我确信我已经安装了我需要的所有依赖项。这是我的 package.json 的相关部分 "dependencies":
我是一名优秀的程序员,十分优秀!