Безопасна ли моя реализация аутентификации / авторизации в моем приложении Do tnet Core 3.1 с RazorPages и SQL сервером DbContext - PullRequest
0 голосов
/ 30 апреля 2020

Я изучаю DotNetCore 3.1 и работаю над учебными пособиями Microsoft по созданию веб-приложения в Azure с использованием своего нового пакета Microsoft.Identity.Web.

Мое приложение работает, тестовые пользователи могут войти в систему / из приложения успешно. Однако я не уверен, реализовал ли я аутентификацию / авторизацию таким образом, чтобы защитить данные и учетные данные пользователя.

Ниже приводится то, что я считаю соответствующим кодом.

Startup.cs инициализирует кеш токена Microsoft.Identity.Web включает более простую реализацию аутентификации OpenId и AzureAd services.AddSignIn(Configuration)

Мой фрагмент Startup.cs

using Microsoft.Identity.Web;
using Microsoft.Identity.Web.TokenCacheProviders.InMemory;
using Microsoft.Identity.Web.UI;

// code abbreviated for clarity

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDistributedMemoryCache();

            services.Configure<CookiePolicyOptions>(options =>
            {
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
                options.HandleSameSiteCookieCompatibility();
            });

            services.AddOptions();

            services.AddSignIn(Configuration);

            services.AddWebAppCallsProtectedWebApi(Configuration, 
                                new string[] { Constants.ScopeUserRead })
                .AddInMemoryTokenCaches();


            services.AddDbContextPool<AppDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("AzureSqlConStr")));

            services.AddScoped<IDbData, DbData>();

Следующий класс получает access_token и передает его в DbContext. Он также реализует интерфейс для получения и взаимодействия с объектами Db.

Я хотел, чтобы действия по аутентификации не использовались в RazorPages, и мне было трудно передавать access_token в соединение для DbContext.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Identity.Web;
using System.Collections.Generic;
using System.Linq;

    public class DbData : IDbData
    {
        private readonly AppDbContext db;
        private readonly ITokenAcquisition tokenAcquisition;
        private readonly IConfiguration configuration;
        private string accessToken;
        public DbData(AppDbContext db, ITokenAcquisition tokenAcquisition, IConfiguration configuration)
        {
            this.db = db;
            this.tokenAcquisition = tokenAcquisition;
            this.configuration = configuration;
            AuthenticateDb();
        }

        private async void AuthenticateDb()
        {
            accessToken = await tokenAcquisition.GetAccessTokenForUserAsync(
                                    new[] { $"https://database.windows.net//.default" });
            db.AuthenticateConn(accessToken);
        }

И мой DbContext, в котором есть функция, которая берет access_token и передает его в DbConnection.

    public class AppDbContext : DbContext
    {

        public AppDbContext(DbContextOptions<AppDbContext> options)
                : base(options)
        {
        }

        public void AuthenticateConn(string tokenstring)
        {

            var conn = (Microsoft.Data.SqlClient.SqlConnection)Database.GetDbConnection();
            conn.AccessToken = tokenstring;

        }
...