Я не могу найти безопасный способ получить только данные, связанные с аутентифицированными пользователями, используя основные веб-API ASP.net и Angular (PWA).
Я пытался1. MSAL внутри Angular и вызывает функцию API с идентификатором входа, но клиентские коды на основе Java не кажутся безопасными, или я могу ошибаться.
http.get ('https://api.abc.edu/api/students/11223@abc.edu) ->11223 является родительским логином.
Я попробовал альтернативный вариант внутри веб-API для получения идентификатора входа в систему, а затем вызвал базу данных для получения данных.
var userId = _httpContextAccessor.HttpContext.User.FindFirst ("предпочитаемое_имя_пользователя"). Значение;
По-английски:
getItems(parentID: string): Observable<ParentStudent[]> {
return this.http.get(this.apiEndpointParentStudents + "/" + parentID) //parentID is a logged user name from Azure called from Angular.
.map((response: Response) =>
response
)
.catch(response => (Observable.throw(response)
))
}
в режиме webapi:
startup.cs
public void ConfigureServices(IServiceCollection services)
{
// Inject default DB connection string.
services.AddDbContext<SchoolContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddAzureAdBearer(options => Configuration.Bind("AzureAd", options));
services.AddProtectWebApiWithMicrosoftIdentityPlatformV2(Configuration);
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest);
services.AddCors();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); // find a login user.
//services.AddHttpContextAccessor();
services.AddTransient<IUserResolverService, UserResolverService>();
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
----
app.UseAuthentication();
------
}
StudentsController.cs
[HttpGet]
public async Task<ActionResult<IEnumerable<Student>>> GetStudents()
{
var userId = _httpContextAccessor.HttpContext.User.FindFirst("preferred_username").Value;
return await _context.Students.Where(t => t.ParentLoginUsername == userId || t.ParentLoginUsername == userId).ToListAsync();
}
Оба работали нормально, но для обеспечения безопасности, среди моих приведенных выше решений, следуетРешение, основанное на webapi, должно рассматриваться в первую очередь над любыми клиентскими решениями, такими как AngularМогут ли хакеры, другие родители или клиенты других банков (если мой PWA является банковским приложением) вызывать api с идентификатором пользователя других людей в Angular или почтальоне, когда они получают идентификатор авторизации и токен аутентификации?