2016-06-08 20 views
11

Próba użycia uwierzytelniania opartego na torze na okaziciela w prostym projekcie .NET Core Web API. Oto moja Startup.csUwierzytelnianie tokenów na okaziciela w środowisku ASP.NET Core

app.UseMvc(); 
//--- 
const string secretKey = "mysupersecret_secretkey!123"; 
SymmetricSecurityKey signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)); 
SigningCredentials signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256); 
//--- 
const string audience = "Audience"; 
const string issuer = "Issuer"; 
//--- 
TokenValidationParameters tokenValidationParameters = new TokenValidationParameters 
{ 
    ValidateIssuerSigningKey = true, 
    IssuerSigningKey = signingKey, 

    ValidateIssuer = false, 
    ValidIssuer = issuer, 

    ValidateAudience = true, 
    ValidAudience = audience, 

    ValidateLifetime = true, 

    ClockSkew = TimeSpan.Zero, 
    AuthenticationType = JwtBearerDefaults.AuthenticationScheme 
}; 
//--- 
app.UseJwtBearerAuthentication(new JwtBearerOptions 
{ 
    AutomaticAuthenticate = true, 
    AutomaticChallenge = true, 
    TokenValidationParameters = tokenValidationParameters, 
    AuthenticationScheme = JwtBearerDefaults.AuthenticationScheme, 
}); 

Również dodać AuthorizeAttribute do działania kontrolerów

[HttpGet] 
[Authorize(ActiveAuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] 
public IEnumerable<string> Get() 
{ 
    return new[] { "value1", "value2" }; 
} 

Ale gdy próbuję wysłać żądanie GET z nagłówka Authorization: Bearer [TOKEN] otrzymuję wyjątek

System.InvalidOperationException: No authentication handler is configured to authenticate for the scheme: Bearer 
    at Microsoft.AspNetCore.Http.Authentication.Internal.DefaultAuthenticationManager. 

Więc co jest ta "obsługa uwierzytelniania"? Gdzie muszę ustawić ten moduł obsługi?

+0

Czy możesz podzielić się swoją całą 'metody configure'? – Pinpoint

+0

Shure, http://pastebin.com/TgRkHNZk app.UseSimpleTokenProvider - to prosta rejestracja Reklamowe Endpoint, znalazłem go tutaj: https://github.com/nbarbettini/SimpleTokenProvider – Maxim

Odpowiedz

24

W środowisku ASP.NET Core kolejność oprogramowania warstwy pośredniej ma znaczenie: są one wykonywane w tej samej kolejności, w jakiej zostały zarejestrowane. W tym przypadku przed oprogramowaniem pośrednim JWT wywoływanym jest app.UseMvc(), więc to nie może działać.

Put app.UseMvc() na końcu rurociągu i to powinno działać:

app.UseJwtBearerAuthentication(new JwtBearerOptions 
{ 
    AutomaticAuthenticate = true, 
    AutomaticChallenge = true, 
    TokenValidationParameters = tokenValidationParameters, 
    AuthenticationScheme = JwtBearerDefaults.AuthenticationScheme, 
}); 

app.UseMvc(); 
+1

Dziękuję bardzo! – Maxim

Powiązane problemy