Dotnet webapp 模板有 app.UseAuthorization() 没有 app.UseAuthentication()

Posted

技术标签:

【中文标题】Dotnet webapp 模板有 app.UseAuthorization() 没有 app.UseAuthentication()【英文标题】:Dotnet webapp templates have app.UseAuthorization() without app.UseAuthentication() 【发布时间】:2022-01-10 20:44:15 【问题描述】:

几乎所有 dotnet 默认模板在管道配置中都有 app.UseAuthorization() 行,而没有 app.UseAuthentication()。例如,inline 是在 .net 6.0 中通过运行 dotnet new webapp 创建的 webapp

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())

    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();


app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

让我感兴趣的是,授权只能与身份验证一起使用,因此在管道中必须同时拥有 app.UseAuthentication()app.UseAuthorization()。此外,顺序必须准确,即app.UseAuthentication() 后面必须跟app.UseAuthorization()

但是,使用默认模板创建的管道只有 app.UseAuthorization()。有人可以阐明在管道中添加 app.UseAuthorization() 的目的可能是什么吗?

【问题讨论】:

我不确定,但在文档中提到,当授权使用端点路由路由的资源时,此调用必须出现在对 app.UseRouting() 和 app.UseEndpoints( ...) 以使中间件正常运行。所以它会为它生成代码,这样开发人员就不会犯错误。我会请专家发表评论 我明白了。因此,当我调用一个用 [Authorize] 装饰的操作方法而没有正确设置身份验证和授权时,我在开发人员异常页面上得到的很好的异常是因为这个中间件? 查看这个帖子:The purpose to add app.UseAuthorization() middleware when using a default template to create a none-Authentication application 谢谢。这回答了我的问题。 @DurgaPrasad,很高兴听到它确实有助于解决问题。我将其添加为答案,希望它可以帮助其他社区成员快速解决类似问题。 【参考方案1】:

这是一个已知问题:The purpose to add app.UseAuthorization() middleware when using a default template to create a none-Authentication application

从 3.1 开始,端点路由替换了一些 MVC 结构,包括用 AuthorizationMiddleware 替换 auth 过滤器。因此,每当您碰巧使用 MVC 时,您都需要中间件。特别是因为您可能拥有不需要对用户进行身份验证的授权规则。例如,RequireHttpsAttribute 是一个身份验证过滤器,它要求资源仅允许通过 TLS 连接。您可以设想基于 HTTP 请求特征而不是登录用户的其他身份验证要求。

【讨论】:

以上是关于Dotnet webapp 模板有 app.UseAuthorization() 没有 app.UseAuthentication()的主要内容,如果未能解决你的问题,请参考以下文章

我如何在单个NuGet软件包中提供多个`dotnet new`模板?

在 Django 模板中使用 webapp2.uri_for

通过dotnet cli中的自定义模板创建类时如何检测命名空间

GAE Django webapp2 模板渲染

使用 Google App Engine(Webapp)访问 Django 模板中的会话变量 - Python

webapp2 - 如何反转模板中的URL?