web-dev-qa-db-ja.com

ASP.NET Coreでの承認。 [Authorize]属性では常に401 Unauthorized

初めてASP.NET Coreで承認を作成します。ここからチュートリアルを使用しました [〜#〜] tutorial [〜#〜]

問題は私が郵便配達員からリクエストを送るときです:

Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6I...

[Authorize]属性で装飾されたコントローラーの私のメソッドに。

私は受け取ります 401 Unauthorized常に...チュートリアルの下にコメントが表示されましたが、一部の人々にも同様の問題があるようです。どうすればこの問題を解決できるのかわかりません。

18
DiPix

ここで他の人の要求で答えがあります:

問題は、Startup.csのミドルウェアの順序にありました

_public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    ConfigureAuth(app); // your authorisation configuration

    app.UseMvc();
}
_

ミドルウェアの順序が重要なのはなぜですか?最初にapp.UseMvc()を置くと、MVCアクションがルーティングに入り、Authorize属性が表示されると、それらの処理が制御されるため、401 Unauthorizedエラーが返されます。

私はそれが誰かを助けることを願っています;)

23
DiPix

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.

6
eugenecp

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();

3
Chetha

私の場合、私は coreApiangularClient チュートリアルに従っていましたが、毎回不正なエラーが発生しました私の場合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());

    }
2

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();

0
Christian Arce