Это все ново для меня, и я все еще пытаюсь обернуть голову вокруг этого. У меня настроен IDP (Identity Server 4), и я смог настроить клиент для аутентификации в нем (приложение Angular 6) и, более того, для аутентификации в API (Asp.Net Core 2.0). Кажется, все работает нормально.
Вот определение клиента в IDP:
new Client
{
ClientId = "ZooClient",
ClientName = "Zoo Client",
AllowedGrantTypes = GrantTypes.Implicit,
AllowAccessTokensViaBrowser = true,
RequireConsent = true,
RedirectUris = { "http://localhost:4200/home" },
PostLogoutRedirectUris = { "http://localhost:4200/home" },
AllowedCorsOrigins = { "http://localhost:4200" },
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.Email,
IdentityServerConstants.StandardScopes.Phone,
IdentityServerConstants.StandardScopes.Address,
"roles",
"ZooWebAPI"
}
}
Я запрашиваю следующие области в клиенте:
'почтовые роли openid профиля ZooWebAPI'
WebAPI настроен так:
public void ConfigureServices(IServiceCollection services)
{
services
.AddMvcCore()
.AddJsonFormatters()
.AddAuthorization();
services.AddCors();
services.AddDistributedMemoryCache();
services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options =>
{
options.Authority = "https://localhost:44317";
options.RequireHttpsMetadata = false;
options.ApiName = "ZooWebAPI";
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors(policy =>
{
policy.WithOrigins("http://localhost:4200");
policy.AllowAnyHeader();
policy.AllowAnyMethod();
policy.AllowCredentials();
policy.WithExposedHeaders("WWW-Authenticate");
});
app.UseAuthentication();
app.UseMvc();
}
Используя [Authorize], я успешно смог защитить API:
[Route("api/[controller]")]
[Authorize]
public class ValuesController : Controller
{
// GET api/values
[HttpGet]
public ActionResult Get()
{
return new JsonResult(User.Claims.Select(
c => new { c.Type, c.Value }));
}
}
Все работает нормально, если клиент не аутентифицирован, браузер переходит на IDP, требует аутентификации, перенаправляет обратно с токеном доступа, токен затем используется для успешно выполненных вызовов API.
Если я посмотрю на Заявления в объекте Пользователь, я смогу увидеть некоторую информацию, но у меня нет никакой пользовательской информации. Я могу видеть области видимости и т. Д., Но не роли, например. Из того, что я прочитал, этого следует ожидать, и API не должно заботиться о том, что пользователь вызывает, но как бы я ограничил вызовы API на основе ролей? Или это будет полностью против спецификаций?
У IDP есть конечная точка userinfo, которая возвращает всю пользовательскую информацию, и я подумал, что она будет использоваться в WebAPI, но, опять же, после некоторого чтения похоже, что намерение состоит в том, чтобы эта конечная точка была вызвана из только клиент.
В любом случае, я хотел бы ограничить вызовы веб-API на основе ролей для конкретного пользователя. У кого-нибудь есть предложения, комментарии? Кроме того, я хотел бы знать, какой пользователь выполняет вызов, как бы я поступил таким образом?
Пример JWT:
Спасибо