初めてASP.NET Coreで承認を作成します。ここからチュートリアルを使用しました [〜#〜] tutorial [〜#〜]
問題は私が郵便配達員からリクエストを送るときです:
Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6I...
[Authorize]属性で装飾されたコントローラーの私のメソッドに。
私は受け取ります 401 Unauthorized
常に...チュートリアルの下にコメントが表示されましたが、一部の人々にも同様の問題があるようです。どうすればこの問題を解決できるのかわかりません。
ここで他の人の要求で答えがあります:
問題は、Startup.csのミドルウェアの順序にありました
_public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
ConfigureAuth(app); // your authorisation configuration
app.UseMvc();
}
_
ミドルウェアの順序が重要なのはなぜですか?最初にapp.UseMvc()
を置くと、MVCアクションがルーティングに入り、Authorize属性が表示されると、それらの処理が制御されるため、401 Unauthorizedエラーが返されます。
私はそれが誰かを助けることを願っています;)
aSP.NET Core 3.0では、同じ問題がありましたが、うまくいったのは次のとおりです。
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
startUp.Configureメソッド内。
このドキュメントは、ミドルウェアコンポーネントの一般的な順序を示しています。 https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.
ASP.NET Core 3.0を使用している場合
この注文を確認
app.UseAuthentication();
app.UseRouting();
//以下でなければなりませんapp.UseAuthentication();
ASP.NET Core <3.0を使用している場合
app.UseRouting();
をapp.UseMvc();
に置き換えるだけです
つまり:
app.UseAuthentication();
app.UseMvc();
//以下でなければなりませんapp.UseAuthentication();
私の場合、私は coreApi 、 angularClient チュートリアルに従っていましたが、毎回不正なエラーが発生しました私の場合angularアプリケーションはコアで実行されていますAPIプロジェクト。
それで私はこのように順序を変更し、それは今動作します
public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory loggerFactory)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
});
app.UseSpa(spa =>
{
// To learn more about options for serving an Angular SPA from ASP.NET Core,
// see https://go.Microsoft.com/fwlink/?linkid=864501
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
// global cors policy
app.UseCors(x => x
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
}
StartupクラスのMy ConfigureServicesおよびConfigureメソッド(Asp.Net Core 3.1.0):
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("AllowsAll", builder =>
{
builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
});
});
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
...
});
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseCors(options => options.AllowAnyOrigin());
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
私のコントローラー:
[Authorize]
[EnableCors("AllowsAll")]
[Route("[controller]")]
public class MyController : MyController
{
...
}
私の解決策は、スタートアップの構成方法でミドルウェアやその他のものの正しい順序を確認することでした。一般的にapp.UseMvc();