Sdílet prostřednictvím


Ověřování a zabezpečení

Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019

Tento článek se týká pouze webových rozšíření, nikoli rozšíření úloh Pipelines nebo rozšíření koncového bodu služby. U těchto úloh můžete použít úlohu Publikovat do služby Azure Service Bus.

Tip

Projděte si nejnovější dokumentaci k vývoji rozšíření pomocí sady SDK rozšíření Azure DevOps.

Volání rozhraní REST API z vašeho rozšíření

Většina rozšíření musí za aktuálního uživatele volat rozhraní REST API Azure DevOps.

  • Pokud používáte zadanou službu JavaScript REST clients, automaticky se za vás zpracuje ověřování. Tito klienti automaticky požadují přístupový token ze základní sady SDK a nastaví ho v autorizační hlavičce požadavku.

  • Pokud nepoužíváte poskytnuté klienty, musíte požádat o token z Core SDK autorizační hlavičky požadavku:

    VSS.require(["VSS/Authentication/Services"],
        function (VSS_Auth_Service) {
            VSS.getAccessToken().then(function(token){
                // Format the auth header
                var authHeader = VSS_Auth_Service.authTokenManager.getAuthorizationHeader(token);
    
                // Add token as an Authorization header to your request
            });
        });
    

Ověřování požadavků ve vaší službě

Běžným scénářem je volání back-endové služby z rozšíření. Pokud chcete ověřit, že tato volání pocházejí z vašeho rozšíření spuštěného v Azure DevOps a k ověření pravosti aktuálního uživatele (a dalších kontextových informací), je pro vaše rozšíření zpřístupněn speciální typ tokenu. Tento token obsahuje informace o tom, kdo volá, a také podpis, který můžete ověřit, abyste věděli, že žádost pochází z vašeho rozšíření.

Získání klíče rozšíření

Jedinečný klíč vašeho rozšíření (který se vygeneruje při publikování rozšíření) můžete použít k ověření pravosti požadavků provedených z vašeho rozšíření.

Tento klíč získáte tak, že kliknete pravým tlačítkem na publikované rozšíření a vyberete Certifikát.

key

Upozorňující

Změny rozsahu v rozšíření způsobí, že se certifikát změní. Pokud v oboru provedete změny, potřebujete nový klíč rozšíření.

Vygenerování tokenu pro poskytování vaší službě

  1. Metoda Core SDK getAppToken vrátí příslib, že při vyřešení obsahuje token podepsaný certifikátem vašeho rozšíření.

    VSS.getAppToken().then(function(token){
        // Add token to your request
    });
    
  2. Tento token předejte službě jako parametr dotazu nebo hlavičku požadavku.

Parsování a ověření tokenu

Tady je ukázka analýzy tokenu. Nejprve stáhněte a uložte tajný kód pro vaše rozšíření. Můžete to získat ze stránky vydavatele. Tento tajný klíč musí být dostupný pro vaši aplikaci.

.NET Framework

Chcete-li tuto ukázku zkompilovat, musíte přidat 1 odkaz.

  1. Otevřete Správce balíčků NuGet a přidejte odkaz na System.IdentityModel.Tokens.Jwt. Tato ukázka byla vytvořena s verzí 5.2.2 tohoto balíčku.
using System.Collections.Generic;
using System.ServiceModel.Security.Tokens;
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.UTF8Encoding.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);
		}
	}
}

.NET Core – WebAPI

Chcete-li tuto ukázku zkompilovat, musíte přidat 1 odkaz.

  1. Otevřete Správce balíčků NuGet a přidejte odkaz na System.IdentityModel.Tokens.Jwt. Tato ukázka byla vytvořena s verzí 5.1.4 tohoto balíčku.

Startup.cs

using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
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.AddMvc();

            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, IHostingEnvironment env)
        {
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseMvc();
            app.UseStaticFiles();
        }
    }
}

Kontrolery rozhraní API:

[Route("api/[controller]"), 
 Authorize()]
public class SampleLogicController : Controller
{
   // ...
}