Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Este artículo solo se aplica a la autenticación y la seguridad de las extensiones web, y no a las extensiones de tareas de Pipelines ni a las extensiones de extremo de servicio. Para esas tareas, puede usar la tarea Publicar en Azure Service Bus.
Llamada a las API REST desde la extensión
La mayoría de las extensiones deben llamar a las API rest de Azure DevOps en nombre del usuario actual.
Si usa el proporcionado
JavaScript REST clients, la autenticación se gestiona automáticamente. Estos clientes solicitan un token de acceso desde el SDK principal y lo establecen en el encabezado autorización de la solicitud.Si no usa los clientes proporcionados, debe solicitar un token de
Core SDKy establecerlo en el encabezado de autorización en su solicitud.import * as SDK from "azure-devops-extension-sdk"; import { getAccessToken } from "azure-devops-extension-sdk"; SDK.init(); getAccessToken().then((token) => { // Format the auth header const authHeader = `Bearer ${token}`; // Add token as an Authorization header to your request console.log(authHeader); });
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones mediante el SDK de extensión de Azure DevOps.
Autenticación de solicitudes en el servicio
Un escenario común consiste en realizar llamadas a un servicio back-end desde una extensión. Para comprobar que estas llamadas proceden de la extensión que se ejecuta en Azure DevOps y para autenticar al usuario actual y otra información de contexto, se proporciona un tipo especial de token a la extensión. Este token contiene información sobre el autor de la llamada y una firma que puede autenticar para garantizar que la solicitud se originó en su extensión.
Obtención de la clave de la extensión
La clave única de la extensión, generada cuando se publica la extensión, se puede usar para comprobar la autenticidad de las solicitudes realizadas desde la extensión.
Para obtener esta clave, vaya al portal de administración de extensiones, haga clic con el botón derecho en una extensión publicada y seleccione Certificado.
Advertencia
Los cambios de ámbito en una extensión hacen que el certificado cambie. Si realiza cambios en el ámbito, necesita una nueva clave de extensión.
Generar un token para proporcionar a tu servicio
El método Core SDK
getAppTokendevuelve una promesa que, cuando se resuelve, contiene un token firmado con el certificado de la extensión.import * as SDK from "azure-devops-extension-sdk"; import { getAppToken } from "azure-devops-extension-sdk"; SDK.init(); getAppToken().then((token) => { // Add token to your request console.log(token); });Pase este token al servicio como un parámetro de consulta o encabezado de solicitud.
Análisis y validación del token
Este es un ejemplo de análisis del token. En primer lugar, descargue y almacene el secreto de la extensión desde la página del publicador. Este secreto debe estar disponible para la aplicación.
.NET Framework
Realice la siguiente tarea para agregar una referencia para obtener el ejemplo que se va a compilar.
Abra el Administrador de paquetes NuGet y agregue una referencia a System.IdentityModel.Tokens.Jwt. Este ejemplo se creó con la versión 6.8.0 de este paquete.
using System;
using System.IdentityModel.Tokens.Jwt;
using Microsoft.IdentityModel.Tokens;
namespace TokenSample
{
class Program
{
static void Main(string[] args)
{
string secret = ""; // Load your extension's secret
string issuedToken = ""; // Token you are validating
var validationParameters = new TokenValidationParameters()
{
IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(secret)),
ValidateIssuer = false,
RequireSignedTokens = true,
RequireExpirationTime = true,
ValidateLifetime = true,
ValidateAudience = false,
ValidateActor = false
};
SecurityToken token = null;
var tokenHandler = new JwtSecurityTokenHandler();
var principal = tokenHandler.ValidateToken(issuedToken, validationParameters, out token);
// Use the principal object as needed
Console.WriteLine(principal.Identity.Name);
}
}
}
.NET Core: WebAPI
Realice la siguiente tarea para agregar una referencia para que se compile este ejemplo.
Abra el Administrador de paquetes NuGet y agregue una referencia a System.IdentityModel.Tokens.Jwt. Este ejemplo se creó con la versión 5.1.4 de este paquete.
Startup.cs
using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
namespace TokenSample.Core.API
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
string _secret = "ey9asfasdmax..<the secret key downloaded from the Azure DevOps Services publisher page>.9faf7eh";
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer((o) =>
{
o.TokenValidationParameters = new TokenValidationParameters()
{
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_secret)),
ValidateIssuer = false,
ValidateAudience = false,
ValidateActor = false,
RequireSignedTokens = true,
RequireExpirationTime = true,
ValidateLifetime = true
};
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseAuthentication();
app.UseAuthorization();
app.UseRouting();
app.UseStaticFiles();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
Los controladores de API:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[Route("api/[controller]")]
[Authorize]
public class SampleLogicController : ControllerBase
{
// ...
}