【问题标题】:How to protect all controllers by default with bearer token in ASP.NET Core?如何在 ASP.NET Core 中使用不记名令牌默认保护所有控制器?
【发布时间】:2016-05-01 21:28:42
【问题描述】:

我已将 JWT 中间件添加到我的应用程序中:

app.UseJwtBearerAuthentication(options => { options.AutomaticAuthenticate = true;} )

不有趣的是,它会为所有操作抛出 500 异常(在以后的版本中应该更改为 401),即使是那些根本不受保护的操作(没有授权属性)。在我看来这是错误的,但也许我自己做错了什么。

理想情况下,我想要实现的是默认情况下所有操作都受到保护(在以前的 ASP.NET 中有过滤器),如果我希望公开或授权(“SomePolicy”),我会将匿名设置为我想要额外的政策,但我希望没有令牌根本无法访问 API。我如何在新的 ASP.NET 中执行此操作(我知道我可以从具有此属性的某些控制器继承,但我希望有更好的方法)?

【问题讨论】:

    标签: c# authentication asp.net-core jwt asp.net-identity


    【解决方案1】:

    .Net 6 开始,我们可以这样做(如果使用微软推荐的最小托管模型):

    app.MapControllers().RequireAuthorization();
    

    .Net Core 3开始我们可以这样做:

    app.UseEndpoints(endpoints =>
    {
        endpoints
            .MapControllers()
            .RequireAuthorization(); // This will set a default policy that says a user has to be authenticated
    });
    

    可以更改默认策略或添加新策略并使用它。

    附:请注意,即使方法名称显示“授权”,默认情况下它只要求用户经过身份验证。不过,可以添加更多策略来扩展验证。

    【讨论】:

    • 我猜 RequireAuthorization 意味着身份验证。
    • 您可以查看代码中的注释来准确解释这一点:它为所有控制器添加了默认策略,其中授权仅表示身份验证(默认策略)。这可以通过使用策略进一步配置或更改。但命名并不完美,而且相当混乱,我同意
    • 与总是令人困惑的 401 Unauthorized 相同,应该命名为 UnauthenticatedMDN:“虽然 HTTP 标准指定了“未授权”,但从语义上讲,此响应意味着“未验证”。也就是说,客户端必须对自己进行身份验证才能获得请求的响应。”
    【解决方案2】:

    你仍然可以像这个例子一样使用过滤器:

    services.AddMvc(config =>
    {
        var policy = new AuthorizationPolicyBuilder()
                     .RequireAuthenticatedUser()
                     .Build();
        config.Filters.Add(new AuthorizeFilter(policy));
    });
    

    此示例中的策略非常简单,但有很多方法可以针对各种要求、角色等配置策略。

    【讨论】:

    • 您可以在此处找到其他授权示例:github.com/blowdart/AspNetAuthorizationWorkshop
    • 谢谢,我试试,但是你知道jwt中间件对公共API抛出异常的问题怎么办吗?
    • 我为此提出了一个单独的问题:stackoverflow.com/questions/34995518/…。你的回答解决了原来的问题,谢谢:)
    • 这似乎不适用于 .NET 5,您需要在 AuthorizationPolicyBuilder 中添加策略(例如 AuthorizationPolicyBuilder(new string [] { "defaultPolicy" })
    【解决方案3】:

    以下示例在使用 .NET 5 时对我有用,接受的答案似乎不适用于 .NET 5

    services.AddMvc(config => {
        config.Filters.Add(new AuthorizeFilter());
    });
    

    【讨论】:

      猜你喜欢
      • 2019-05-05
      • 2020-07-25
      • 2016-09-25
      • 2020-03-20
      • 2018-05-04
      • 1970-01-01
      • 2023-03-21
      • 2020-07-09
      • 2018-01-19
      相关资源
      最近更新 更多