Telepítendő alkalmazásként egy másik tárgy példaalkalmazását használjuk.
DB inicializálás után használható felhasználói fiókok
dotnet tool install -g dotnet-ef
dotnet ef database update --project BookShop.Dal --startup-project BookShop.Web/BookShop.Web --connection "connectionstringünk"
Egy előfizetés-régió-OS kombináción belül egyetlen free plan lehet.
Kattintsuk össze a Service Connector kapcsolatot (neve:bookshopdbconn, auth: System-assigned MSI), a végén kiköp egy Azure CLI parancsot. Futtatásnál tegyünk a parancs végére plusz egy kapcsolót: --customized-keys AZURE_SQL_CONNECTIONSTRING=ConnectionStrings__DefaultConnection
Ellenőrizzük portálon, hogy létrejött-e (Validate gomb)
Kicsit sok jogot ad (CONTROL DATABASE), így visszavonhatjuk
REVOKE CONTROL ON DATABASE::[bookshopdb] FROM [<identity-name>];
ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
Állítsuk be a futtatandó appot, mert az App Service az ASP.NET Core Web API és a Blazor appot is indíthatja, de az előbbit kellene.
Configuration -> Stack Settings -> Startup command: dotnet BookShop.Web.dll
dotnet publish "BookShop.Web\BookShop.Web\BookShop.Web.csproj" -c Release -o ./publish
Compress-Archive -Path "./publish/*" -DestinationPath "publish.zip" -Force
az webapp deploy --resource-group bookshop --name <app service neve> --src-path publish.zip --type zip --async
CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
Vegyünk fel környezeti változót az App Service-be (Environment variables) ConnectionStrings__DefaultConnection néven, értéke legyen ugyanaz, mint amit az EF Migrations-nál használtunk (“” nélkül).
Ellenőrző szkript felhasználók listázásához
select name as username,
create_date,
modify_date,
type_desc as type,
authentication_type_desc as authentication_type
from sys.database_principals
where type not in ('A', 'G', 'R', 'X')
and sid is not null
order by username;
– DB permissions for external users SELECT pr.name AS PrincipalName, pr.type_desc AS PrincipalType, pr.authentication_type_desc AS AuthType, perm.permission_name, perm.state_desc, perm.class_desc FROM sys.database_permissions perm JOIN sys.database_principals pr ON perm.grantee_principal_id = pr.principal_id WHERE pr.type = ‘E’ – External users only ORDER BY pr.name;
– List of database roles for the MSI user SELECT dp.name AS principal_name, dp.type_desc AS principal_type, r.name AS role_name FROM sys.database_role_members AS m JOIN sys.database_principals AS dp ON m.member_principal_id = dp.principal_id JOIN sys.database_principals AS r ON m.role_principal_id = r.principal_id;
– List of object-level permissions for the MSI user SELECT d.name AS object_name, dp.name AS principal_name, dp.type_desc AS principal_type, p.permission_name FROM sys.database_permissions AS p JOIN sys.database_principals AS dp ON p.grantee_principal_id = dp.principal_id LEFT JOIN sys.objects AS d ON p.major_id = d.object_id WHERE dp.name NOT IN (‘dbo’,’public’);
- Ellenőrző szkript - ki járt az adatbázisban
```sql
SELECT connection_id,
c.client_net_address,
c.session_id,
connect_time,
client_net_address,
client_tcp_port,
host_name,
program_name,
login_name,
original_login_name,
nt_user_name,
row_count
FROM sys.dm_exec_connections c
JOIN sys.dm_exec_sessions s ON s.session_id = c.session_id
WHERE DATETRUNC(d, s.login_time)= DATETRUNC( d, GETDATE())
az ad sp show --id <a login_name @ előtti része>
https://learn.microsoft.com/en-us/azure/azure-monitor/overview#overview
[<appnév>/slots/<slotnév>]app.UseAuthorization(); után):
```csharp
const int cpuBurnMs = 2000;app.UseWhen(
ctx => HttpMethods.IsGet(ctx.Request.Method) &&
ctx.Request.Path.Equals(“/api/Categories”, StringComparison.OrdinalIgnoreCase),
branch =>
{
var loggerFactory =
branch.ApplicationServices.GetRequiredService
--slot slotnév hozzáadása az az webapp deploy parancshoz