Я изучаю 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;
}