Oharra
Baimena behar duzu orria atzitzeko. Direktorioetan saioa has dezakezu edo haiek alda ditzakezu.
Baimena behar duzu orria atzitzeko. Direktorioak alda ditzakezu.
Servicios de Azure DevOps | Azure DevOps Server | Azure DevOps Server 2022
En este artículo se describe la autenticación solo para las extensiones web . No se aplica a las extensiones de tareas de canalización ni a las extensiones de punto de conexión de servicio.
Sugerencia
Para obtener las instrucciones de desarrollo de extensiones más recientes, incluidas las temáticas y la migración desde VSS. SDK, consulte el portal para desarrolladores del SDK de extensión de Azure DevOps.
Llamada a las API REST desde la extensión
La mayoría de las extensiones llaman a las API rest de Azure DevOps en nombre del usuario actual.
Uso de los clientes REST del SDK: la autenticación se controla automáticamente. Los clientes solicitan un token de acceso desde el SDK y establecen el
Authorizationencabezado .Uso de solicitudes HTTP personalizadas: solicite un token desde el SDK y establezca el encabezado usted mismo:
import * as SDK from "azure-devops-extension-sdk"; SDK.init(); SDK.ready().then(async () => { const token = await SDK.getAccessToken(); const authHeader = `Bearer ${token}`; // Use authHeader in your fetch/XMLHttpRequest calls });
Autenticación de solicitudes en el servicio
Cuando la extensión llama a un servicio back-end que controla, debe comprobar que la solicitud procede de la extensión que se ejecuta en Azure DevOps. El SDK proporciona getAppToken(), que devuelve un JWT firmado con el certificado de la extensión. El servicio valida este token para autenticar la solicitud.
Obtención de la clave de la extensión
La clave única de la extensión se genera al publicar. Úselo para comprobar la autenticidad de los tokens de la extensión.
- Vaya al portal de administración de extensiones.
- Haga clic con el botón derecho en la extensión publicada y seleccione Certificado.
Advertencia
Los cambios de ámbito hacen que el certificado cambie. Obtenga una nueva clave después de modificar los ámbitos.
Generación de un token para el servicio
Use getAppToken() para obtener un JWT firmado con el certificado de la extensión y, a continuación, páselo al servicio:
import * as SDK from "azure-devops-extension-sdk";
SDK.init();
SDK.ready().then(async () => {
const token = await SDK.getAppToken();
// Pass this token to your backend as a header or query parameter
const response = await fetch("https://your-service.example.com/api/data", {
headers: {
"Authorization": `Bearer ${token}`
}
});
});
Validar el token
El servicio back-end valida el JWT mediante la clave secreta de la extensión. En los ejemplos siguientes se muestra cómo implementar la validación.
Importante
Nunca codifique de forma rígida el secreto de extensión en el código fuente. Cárgalo desde variables de entorno, Azure Key Vault u otro almacén de configuración seguro.
.NET (aplicación de consola)
Instale el paquete NuGet:
dotnet add package System.IdentityModel.Tokens.Jwt
Nota:
Use la versión 7.x o posterior. La versión 6.x y anteriores están en desuso. Consulte Ciclo de vida de la versión de IdentityModel para obtener más información.
using System.IdentityModel.Tokens.Jwt;
using Microsoft.IdentityModel.Tokens;
string secret = Environment.GetEnvironmentVariable("EXTENSION_SECRET")
?? throw new InvalidOperationException("EXTENSION_SECRET not configured");
string issuedToken = ""; // Token from the extension request
var validationParameters = new TokenValidationParameters()
{
IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(secret)),
ValidateIssuer = false,
ValidateAudience = false,
ValidateActor = false,
RequireSignedTokens = true,
RequireExpirationTime = true,
ValidateLifetime = true
};
var tokenHandler = new JwtSecurityTokenHandler();
var principal = tokenHandler.ValidateToken(issuedToken, validationParameters, out SecurityToken token);
API web de ASP.NET Core
Instale el paquete NuGet:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
Program.cs
using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
string secret = builder.Configuration["ExtensionSecret"]
?? throw new InvalidOperationException("ExtensionSecret not configured");
builder.Services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters()
{
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret)),
ValidateIssuer = false,
ValidateAudience = false,
ValidateActor = false,
RequireSignedTokens = true,
RequireExpirationTime = true,
ValidateLifetime = true
};
});
var app = builder.Build();
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.MapControllers();
app.Run();
Controlador de API:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[Route("api/[controller]")]
[Authorize]
public class SampleLogicController : ControllerBase
{
// Requests without a valid token return 401 Unauthorized
}