настроена служба авторизации на IdentityServer4
.
База данных для него с доступом через webApi должна быть перемещена в отдельный проект.
доступ к webApi с пользователями возможен только авторизованным пользователям через IdentityServer4.
L для IdentityServer4
, это просто еще один API (диапазон), к которому вам необходимо предоставить доступ.
для работы с пользователями необходимо использовать AspNetIdentity
для доступа к UserManager <ApplicationUser>
и RoleManager <ApplicationUser>
службам
Если я добавлю services.AddIdentity<ApplicationUser,IdentityRole>()
, авторизация через IdentityServer4 перестанет работать.
Если я не добавлю, то услуги UserManager<ApplicationUser>
и RoleManager<ApplicationUser>
недоступны.
Настройка webApi для пользователей
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContextPool<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>() // authorization with token (IdentityServer4) stops working
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvcCore()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddAuthorization(options =>
{
options.AddPolicy("AdminsOnly", policyUser =>
{
policyUser.RequireClaim("role", "admin");
});
options.AddPolicy("ManagerOnly", policyUser =>
{
policyUser.RequireClaim("role", "manager");
});
})
.AddJsonFormatters();
services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ApiName = "UserDbApi";
options.EnableCaching = true;
options.CacheDuration = TimeSpan.FromMinutes(10);
});
services.AddCors(options =>
{
options.AddPolicy("default", policy =>
{
policy.WithOrigins("http://localhost:5003") //access Js client
.AllowAnyHeader()
.AllowAnyMethod();
});
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseCors("default");
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseMvc();
}
Доступ к тестовому контроллеру
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
[Authorize(Roles = "SuperAdmin")]
public ActionResult<IEnumerable<string>> Get()
{
// Access works only with a token issued by IdentityServer4
}
}
Js клиент
var config = {
authority: "http://localhost:5000",
client_id: "js",
redirect_uri: "http://localhost:5003/callback.html",
response_type: "id_token token",
scope: "openid profile custom.profile api1 UserDbApi",
post_logout_redirect_uri: "http://localhost:5003/index.html",
checkSessionInterval: 30000,
revokeAccessTokenOnSignout: true,
automaticSilentRenew: true,
silent_redirect_uri: 'http://localhost:5003/callback-silent.html',
accessTokenExpiringNotificationTime: 60
};
var mgr = new Oidc.UserManager(config);
function getInfo() {
mgr.getUser().then(function (user) {
var url = "https://localhost:7000/api/values";
var xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.onload = function () {
log(xhr.status, JSON.parse(xhr.responseText));
}
xhr.setRequestHeader("Authorization", "Bearer " + user.access_token);
xhr.send();
});
}
Мне мешает авторизация, предоставленная AspNetIdentity !!!
Пожалуйста, помогите!