web-dev-qa-db-ja.com

Asp.netコア2-ベアラートークンでの401エラー

Asp.net Coreによって生成されたトークンを使用して、Authorizedで保護されたメソッドにアクセスできません。

構成:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(cfg =>
            {
                cfg.RequireHttpsMetadata = false;
                cfg.SaveToken = true;
                cfg.Audience = Configuration["Tokens:Issuer"];
                cfg.ClaimsIssuer = Configuration["Tokens:Issuer"];
                cfg.TokenValidationParameters = new TokenValidationParameters()
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = Configuration["Tokens:Issuer"],
                    ValidAudience = Configuration["Tokens:Issuer"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"]))
                };

生成されたトークン:

var claims = new[] {
                new Claim (JwtRegisteredClaimNames.Sub, model.Email),
                new Claim (JwtRegisteredClaimNames.Jti, Guid.NewGuid ().ToString()),
            };

            //_config
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"]));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            var expiration = DateTime.UtcNow.AddDays(7);
            var token = new JwtSecurityToken(_config["Tokens:Issuer"],
                _config["Tokens:Issuer"],
                claims,
                expires: expiration,
                signingCredentials: creds);

            return new TokenModel()
            {
                Token = new JwtSecurityTokenHandler().WriteToken(token),
                Expiration = expiration,
                UserFirstName = model.FirstName,
                UserLastName = model.LastName
            };

生成後、この種のトークンを取得します。

{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ0ZWl4ZWlyYXBlcnNvQGdtYWlsLmNvbSIsImp0aSI6IjVmNTk3OGVkLWRlZjAtNDM3Yi1hOThhLTg3ZWU4YTQ3MmZlNCIsImV4cCI6MTUxODg2ODYxOCwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIn0.1fHXr8jtuZ8PTJmJPBKQIqiOk_c-bCQ6KRyFLLJkU5s",
    "expiration": "2018-02-17T11:56:58.683076Z",
    "userFirstName": null,
    "userLastName": null
}

PostmanのHTTPヘッダーに自動化を追加してもしなくても、 "Unauthorized Exception-401"が表示されます

私はすでにいくつかの他のStack投稿とGitHub投稿をチェックします、それは私のようです設定は大丈夫です。

必要に応じて、構成ファイルを追加できます。

ありがとう。

編集1:

ここで、郵便配達員のヘッダーの画面:

enter image description here

12
OrcusZ

同じ問題に直面しているかどうかはわかりませんが、ASP.NET Coreプロジェクトをあなたのコードに似たコードで実行しています。

APIのログインで提供されるベアラートークンを含めると_401_応答が発生しましたが、これはapp.UseAuthentication()firstメソッドとしてConfigure()を呼び出すことで修正されました。私のコードはこれから変更されました...

_app.UseMvc();
app.UseAuthentication();
_

これに...

_app.UseAuthentication();
app.UseMvc();
_
27
phantomraa

コードは正常に見えます。問題の最も可能性のある根本原因は、アプリケーションに認証ミドルウェアを追加していないことです。 AddAuthenticationIServiceCollection拡張呼び出しは、必要なサービスをすべて登録するだけですが、認証ミドルウェアをHTTP要求パイプラインに追加しません。

この問題を修正するには、Startup.Configure()メソッドに次の呼び出しを追加します。

_public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseAuthentication();

    // ...
}
_

私はあなたのコードで問題を再現することができました、そして、app.UseAuthentication()を呼び出すことは問題を修正します。

5
CodeFuller