Я создаю простое приложение с фиксированными учетными данными, поэтому нет необходимости в интеграции с EF или чем-либо еще.
Я пытаюсь использовать пакет AspNet.Security.OpenIdConnect.Server с конфигурацией JWTЯ могу проверить свои учетные данные и вернуть токен, но с помощью атрибута [Authorize] моя конечная точка всегда возвращает 401 несанкционированных.
Startup.cs
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddOpenIdConnectServer(options =>
{
options.AllowInsecureHttp = true;
options.AccessTokenLifetime = TimeSpan.FromHours(1);
options.TokenEndpointPath = "/v1/authtoken";
options.AccessTokenHandler = new JwtSecurityTokenHandler
{
OutboundClaimTypeMap = new Dictionary<string, string>()
};
options.Provider = new AuthorizationProvider();
options.SigningCredentials.AddKey(Key);
})
.AddJwtBearer();
....
app.UseAuthentication();
AuthorizationProvider.cs
public override Task HandleTokenRequest(HandleTokenRequestContext context)
{
if (context.Request.IsClientCredentialsGrantType())
{
if (!string.Equals(context.Request.ClientId, "username", StringComparison.Ordinal) ||
!string.Equals(context.Request.ClientSecret, "password, StringComparison.Ordinal))
{
context.Reject(
error: OpenIdConnectConstants.Errors.InvalidGrant,
description: "Invalid user credentials.");
return Task.CompletedTask;
}
var identity = new ClaimsIdentity(context.Scheme.Name);
identity.AddClaim(new Claim(OpenIdConnectConstants.Claims.Subject, "subject"));
identity.AddClaim(ClaimTypes.Role, "user", OpenIdConnectConstants.Destinations.AccessToken,
OpenIdConnectConstants.Destinations.AccessToken);
var ticket = new AuthenticationTicket(
new ClaimsPrincipal(identity),
new AuthenticationProperties(), context.Scheme.Name);
ticket.SetResources("resource_server");
context.Validate(ticket);
}
return Task.CompletedTask;
}
Контроллер
[Authorize(Roles = "user")]
public class ValuesController : Controller
Согласно jwt.io, это полезная нагрузка внутри JWT:
{
"sub": "subject",
"http://schemas.microsoft.com/ws/2008/06/identity/claims/role": "user",
"token_usage": "access_token",
"jti": "7b5d3180-b535-489b-97ec-fccaedf9615a",
"cfd_lvl": "private",
"aud": "resource_server",
"azp": "username",
"nbf": 1550510623,
"exp": 1550514223,
"iat": 1550510623,
"iss": "https://localhost:44302/"
}
Также пытался использовать только [Authorize]
, но я также получаю401 не авторизован.
Если я использую токен ASOS по умолчанию, он работает без проблем, просто возникают проблемы при использовании JWT (который я пытаюсь использовать, потому что хочу добавить пользовательский ключ, а не сертификат).
Почтальон Тело запроса