ASP.NET core Web API授权属性返回404错误并强制重定向

2023-12-22

我有 asp.net core 2.0 解决方案,其中包含以下项目:

  • Data:EF代码的类库
  • OAuth:作为 IdentityServer4 代码的 Web 应用程序项目
  • Api:用于我创建为空 Web 项目的 API

现在OAuth项目配置了aspnetidentity并且工作正常,我能够在身份验证后获取令牌,这是它的启动代码:

public void ConfigureServices(IServiceCollection services)
{
    // connect with normal database
    services.AddDbContext<MCareContext>(options => options.UseSqlServer(Configuration
              .GetConnectionString("MCareConnection")));

    services.AddIdentity<User, IdentityRole>()
        .AddEntityFrameworkStores<MCareContext>()
        .AddDefaultTokenProviders();


    services.AddMvc();

    // IS configurations database
    var dbConnectionString = Configuration.GetConnectionString("MCareConnection.OAuth");
    var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;

    services.AddIdentityServer()
         .AddConfigurationStore(options =>
         {
            options.ConfigureDbContext = builder =>
                builder.UseSqlServer(dbConnectionString,
                    sql => sql.MigrationsAssembly(migrationsAssembly));
         })

        .AddOperationalStore(options =>
        {
            options.ConfigureDbContext = builder =>
                builder.UseSqlServer(dbConnectionString,
                    sql => sql.MigrationsAssembly(migrationsAssembly));
        })

        .AddAspNetIdentity<User>()
        .AddDeveloperSigningCredential(); 
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    DatabaseInitializer.InitializeDatabase(app);

    loggerFactory.AddConsole();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseIdentityServer();

    app.UseStaticFiles();
    app.UseMvcWithDefaultRoute();
}

现在 API 项目上的问题是,每当我打开任何授权的控制器/操作时,它都会给我 404 错误,这是启动代码:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<MCareContext>(options => options.UseSqlServer(Configuration
      .GetConnectionString("MCareConnection")));

    services.AddIdentity<User, IdentityRole>()
        .AddEntityFrameworkStores<MCareContext>()
        .AddDefaultTokenProviders();

    services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
     .AddIdentityServerAuthentication(options =>
     {
         options.Authority = "http://localhost:60415";
         options.ApiName = "mCareApi";
         options.RequireHttpsMetadata = false;
     });

    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole();

    app.UseAuthentication();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseDefaultFiles();
    app.UseStaticFiles();            

    app.UseMvcWithDefaultRoute();
}

如果我在上面的代码中关闭这部分:

//services.AddIdentity<User, IdentityRole>()
    //.AddEntityFrameworkStores<MCareContext>()
    //.AddDefaultTokenProviders();

然后 Authorize 属性按预期工作,但另一个新问题是,每当我打开任何像 AccountController 这样在其构造函数上期望 UserManager userManager 的控制器时,它都会显示 500 内部服务器错误

InvalidOperationException:无法解析类型的服务 Microsoft.AspNetCore.Identity.UserManager`1[Mcare.Data.Entities.User] 尝试激活 Mcare.Api.Controllers.AccountsController 时

我想知道为什么会发生这种情况以及如何解决这个问题,而不是将 IdentityServer4 项目与 API 项目混合在一起,因为我见过的所有项目都将它们混合在一个项目中。


当 DefaultChallengeScheme 遇到可能导致 404 的授权属性时,是否有可能重定向到不存在的页面(例如登录页面)?

尝试将默认质询设置为 Jwt 模式,该模式返回未授权。

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddIdentityServerAuthentication(options =>
{
    options.Authority = "http://localhost:60415";
    options.ApiName = "mCareApi";
    options.RequireHttpsMetadata = false;
});

或者您可以通过提供事件处理程序来尝试我在下面的文章中提到的方法。

services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
    options.JwtBearerEvents = new JwtBearerEvents
    {
        OnChallenge = context =>
        {
            context.Response.StatusCode = 401;
            return Task.CompletedTask;
        }
    };
    options.Authority = "http://localhost:60415";
    options.ApiName = "mCareApi";
    options.RequireHttpsMetadata = false;
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET core Web API授权属性返回404错误并强制重定向 的相关文章

随机推荐

  • sql查询从两个表中获取记录

    表A Id pin status etc 1 11 FAILED 2 22 3 44 4 55 FAILED Table B id PIN msg counter 1 11 xyz 1 4 55 wsc 10 表数据 我有2个表表A 状态
  • 首次使用 Google 地图启动 Activity 非常慢

    我想在我的活动之一中添加 SupportMapFragment 我将此片段直接添加到布局 xml 中 并将此布局设置为内容视图 但是当Activity第一次启动时 花费的时间太长 超过1秒 下次启动就可以了 只需几毫秒 I tried 删除
  • 实时转录 | Twilio 代理会议

    我指的是克里斯给出的演示here https youtu be Am74WU1zENA t 727 尤其是 Stuart 和 Kris 所显示的单独的活跃转录 我熟悉会议 聚集 拨号 但我无法复制整个架构 我有兴趣让 2 个人参加会议 并以
  • 使用 opencv C++、SolvePnP 函数进行相机位姿估计

    我正在尝试测量相机的姿势 并且我已经完成了以下操作 标记世界 3 D 假设 z 0 因为它是平的 点位于平面上正方形的角上 并假设世界坐标系 以 cms 为单位 以正方形的左上角为原点 并按以下顺序给出世界点 x y 或 列 行 0 0 1
  • 如何将 Galleria 插件与 Rails 4 Pipeline 一起使用

    我最近在让 Galleria 插件与 Rails 4 Pipeline 一起使用时遇到了麻烦 我花了一段时间才弄清楚如何让它工作 所以我想分享解决方案 以防有人遇到类似的问题 1 下载插件后 将galleria 1 3 3 js 这是我写这
  • 如何使用 Jquery 在 iframe 中加载 url

    我想在点击时加载 iframe 这就是我到目前为止所拥有的 frame click function this load http www google com 这不起作用 这是完整的代码 JS Bin http jsbin com oma
  • 如何在div内替换div的样式(背景颜色)

    如果我有这样的 HTML 如何交替使用 id container 的 div 内的 div 的样式 带有 jquery 的背景颜色 偶数和奇数 div div div div div div div div div div 我知道像这样的桌
  • 在 html5 画布上拖动图像并调整其大小

    我正在构建一个 HTML5 画布图像编辑器 将图像上传到画布后 我需要拖动并在画布上调整其大小 我设法上传图像并使其可在画布上拖动 但我需要让它沿着画布调整大小 提前致谢 var Img new Image Img src file Img
  • vb.net 中 Timer.Start 和 Timer.Enabled = True 有什么区别?

    我想知道在 vb net 中启动计时器和启用计时器有什么区别 他们都做同样的事情 根据MSDN http msdn microsoft com en us library 7dd5f0z7 28v vs 110 29 aspx启动方法 通过
  • 何时在数据库列中使用逗号分隔值?

    好的 我知道技术答案是NEVER https stackoverflow com questions 3653462 is storing a comma separated list in a database column really
  • Spotfire IronPython 脚本可滚动筛选器并每一步更新可视化(按日期范围播放按钮)

    大家早上好 我已经研究这个问题几天了 但无法找到解决办法 我已经研究和谷歌搜索无济于事 任何帮助 见解将不胜感激 我正在尝试创建一个按钮 单击该按钮时将自动通过日期过滤器 例如从 1 1 15 开始 并通过 1 2 1 5 在逐步通过时使用
  • 找不到符号方法startActivity(android.content.Intent)

    我是制作 Android 应用程序的初学者 我制作了一个显示我的网页的网络视图 我的网页包含我希望在邮件和拨号等外部应用程序中打开的联系人按钮 因此我得到了一些帮助并得到了这样的代码 import android app Activity
  • 如何检测浏览器类型及其版本

    我如何在 Rails 中检测浏览器类型及其版本 我想检查特定浏览器的版本 如果不需要浏览器版本 则要求用户升级它 我使用下面指定的命令 但由于它不遵循标准模式 我无法使用它 request env HTTP USER AGENT Chrom
  • PHP YAML 解析器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • CSS 定位和 CSS 边距之间的区别

    今天我学习了CSS中的两个概念 一个是CSS定位 静态 相对 绝对 固定 另一个是CSS边距 它定义元素之间的空间 假设我想移动一个元素 这是最好的方法吗 因为这两个概念似乎都能够做同样的事情 示例可能如下 代码 CSS定位
  • 抱歉,处理您的请求时发生错误[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在 windows azure 中
  • PhoneGap 文件删除不起作用

    我正在构建一个基本的应用程序 其中非常具有 PhoneGap 功能 因为我试图确定它可以 不能做什么 我已经到了想要删除已在应用程序上下载的文件的阶段 但它不起作用 我使用的大部分代码来自http docs phonegap com en
  • 如何求整数n次根?

    我想找到小于或等于n的k次方根的最大整数 我试过 int n 1 k 但对于 n 125 k 3 这给出了错误的答案 我碰巧知道 5 的立方是 125 gt gt gt int 125 1 3 4 有什么更好的算法 背景 2011 年 这个
  • 随机选择一个目录下的100个文档

    该目录下大约有2000个文档 我想随机选择一些文档并自动将它们复制到新目录 一些相关信息 https stackoverflow com questions 701402 best way to choose a random file f
  • ASP.NET core Web API授权属性返回404错误并强制重定向

    我有 asp net core 2 0 解决方案 其中包含以下项目 Data EF代码的类库 OAuth 作为 IdentityServer4 代码的 Web 应用程序项目 Api 用于我创建为空 Web 项目的 API 现在OAuth项目