Я создал небольшой веб-сайт .NET Core, который позволяет пользователю получать токен на предъявителя с помощью AspNet.Security.OpenIdConnect.Server.Он работает, как и ожидалось, до тех пор, пока я не добавлю services.AddDefaultIdentity<IdentityUser>();
. После добавления идентификатора журнал не показывает никаких признаков проверки токена, а HttpContext.User.Identity.IsAuthenticated
всегда false
.Токены все еще генерируются - кажется, что пропускается только проверка.
public void ConfigureServices(IServiceCollection services)
{
services
.AddAuthentication(OAuthValidationDefaults.AuthenticationScheme)
.AddOAuthValidation(OAuthValidationDefaults.AuthenticationScheme)
.AddOpenIdConnectServer(options =>
{
options.TokenEndpointPath = "/token";
options.AllowInsecureHttp = true;
options.ApplicationCanDisplayErrors = true;
options.Provider.OnValidateTokenRequest = context =>
{
context.Validate();
return Task.CompletedTask;
};
options.Provider.OnHandleTokenRequest = context =>
{
var identity = new ClaimsIdentity(context.Scheme.Name,
OpenIdConnectConstants.Claims.Name,
OpenIdConnectConstants.Claims.Role);
identity.AddClaim(OpenIdConnectConstants.Claims.Subject, "[unique id]");
var ticket = new AuthenticationTicket(
new ClaimsPrincipal(identity),
new AuthenticationProperties(),
context.Scheme.Name);
context.Validate(ticket);
return Task.CompletedTask;
};
});
// When the following line is uncommented the bearer token isn't validated anymore
//services.AddDefaultIdentity<IdentityUser>();
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseDeveloperExceptionPage();
app.UseAuthentication();
app.UseStaticFiles();
app.UseMvc();
}
Пример действий контроллера может быть таким:
public bool Get() => HttpContext.User.Identity.IsAuthenticated;
, и если я добавлю атрибут Authorize
I 'Я получу 404:
[Authorize]
public bool Get() => HttpContext.User.Identity.IsAuthenticated;
Чтобы создать токен, я делаю что-то вроде этого:
POST http://localhost:5005/token HTTP/1.1
User-Agent: Fiddler
Host: localhost:5005
Content-Length: 69
Content-Type: application/x-www-form-urlencoded
client_id=web&grant_type=password&username=username&password=password
И запрос с токеном-носителем выглядит так:
GET http://localhost:5005/customer HTTP/1.1
User-Agent: Fiddler
Host: localhost:5005
Authorization: Bearer <the token received in the previous call>
Всю программу можно скачать здесь: https://gist.github.com/nielslbeck/e454cc1b79aa56948c96f4a24438b34e