Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Anspråk kan skapas från alla användar- eller identitetsdata som kan utfärdas med hjälp av en betrodd identitetsleverantör eller ASP.NET Core-identitet. Ett anspråk är ett namnvärdepar som representerar vad ämnet är, inte vad ämnet kan göra. Den här artikeln beskriver följande områden:
- Konfigurera och mappa anspråk med hjälp av en OpenID Connect--klient
- Ange namn och rollbeskrivning
- Återställa anspråksnamnrymderna
- Anpassa och utöka påståendena genom TransformAsync
Mappa anspråk med OpenID Connect-autentisering
Profilanspråken kan returneras i id_token, som returneras efter en lyckad autentisering. ASP.NET Core-klientappen kräver endast profilens omfång. När du använder id_token för anspråk krävs ingen ytterligare anspråksmappning.
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
options.SignInScheme = "Cookies";
options.Authority = "-your-identity-provider-";
options.RequireHttpsMetadata = true;
options.ClientId = "-your-clientid-";
options.ClientSecret = "-your-client-secret-from-user-secrets-or-keyvault";
options.ResponseType = "code";
options.UsePkce = true;
options.Scope.Add("profile");
options.SaveTokens = true;
});
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Föregående kod kräver Microsoft.AspNetCore.Authentication.OpenIdConnect NuGet-paketet.
Ett annat sätt att hämta användaranspråken är att använda OpenID Connect-api:et för användarinformation. Klientappen ASP.NET Core använder egenskapen GetClaimsFromUserInfoEndpoint för att konfigurera detta. En viktig skillnad jämfört med de första inställningarna är att du måste ange de anspråk som du behöver med hjälp av metoden MapUniqueJsonKey, annars kommer endast name, given_name och email standardanspråk att vara tillgängliga i klientappen. Anspråken som ingår i id_token mappas som standard. Det här är den största skillnaden mot det första alternativet. Du måste uttryckligen definiera några av de anspråk som du behöver.
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
options.SignInScheme = "Cookies";
options.Authority = "-your-identity-provider-";
options.RequireHttpsMetadata = true;
options.ClientId = "-your-clientid-";
options.ClientSecret = "-client-secret-from-user-secrets-or-keyvault";
options.ResponseType = "code";
options.UsePkce = true;
options.Scope.Add("profile");
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.ClaimActions.MapUniqueJsonKey("preferred_username",
"preferred_username");
options.ClaimActions.MapUniqueJsonKey("gender", "gender");
});
var app = builder.Build();
// Code removed for brevity.
Notera
Standardhanteraren för Open ID Connect använder Pushed Authorization Requests (PAR) om identitetsproviderns upptäcktsdokument annonserar stöd för PAR. Identitetsleverantörens detekteringsdokument finns vanligtvis på .well-known/openid-configuration. Om du inte kan använda PAR i klientkonfigurationen på identitetsprovidern kan PAR inaktiveras med hjälp av alternativet PushedAuthorizationBehavior.
builder.Services
.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect("oidc", oidcOptions =>
{
// Other provider-specific configuration goes here.
// The default value is PushedAuthorizationBehavior.UseIfAvailable.
// 'OpenIdConnectOptions' does not contain a definition for 'PushedAuthorizationBehavior'
// and no accessible extension method 'PushedAuthorizationBehavior' accepting a first argument
// of type 'OpenIdConnectOptions' could be found
oidcOptions.PushedAuthorizationBehavior = PushedAuthorizationBehavior.Disable;
});
Om du vill se till att autentiseringen endast lyckas om PAR används använder du PushedAuthorizationBehavior.Require i stället. Den här ändringen introducerar också en ny OnPushAuthorization händelse för OpenIdConnectEvents som kan användas för att anpassa begäran om push-auktorisering eller hantera den manuellt. Mer information finns i API-förslaget.
Namnkrav och rollkravsmappning
Anspråket Name och Role mappas till standardegenskaper i ASP.NET Core HTTP-kontexten. Ibland måste du använda olika anspråk för standardegenskaperna, eller namnanspråket och rollanspråket matchar inte standardvärdena. Anspråken kan mappas med hjälp av egenskapen TokenValidationParameters och ställas in på valfritt anspråk efter behov. Värdena från claims kan användas direkt i HttpContext.User.IdentityNamn-egenskapen och rollerna.
Om User.Identity.Name inte har något värde eller om rollerna saknas kontrollerar du värdena i de returnerade anspråken och anger NameClaimType och RoleClaimType värden. De returnerade anspråken från klientautentiseringen kan visas i HTTP-kontexten.
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
// Other options...
options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "email"
//, RoleClaimType = "role"
};
});
Anspråksnamnområden, standardnamnområden
ASP.NET Core lägger till standardnamnområden i vissa kända anspråk, vilket kanske inte krävs i appen. Du kan valfritt inaktivera de tillagda namnrymderna och använda de exakta anspråk som OpenID Connect-servern skapade.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
JsonWebTokenHandler.DefaultInboundClaimTypeMap.Clear();
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
options.SignInScheme = "Cookies";
options.Authority = "-your-identity-provider-";
options.RequireHttpsMetadata = true;
options.ClientId = "-your-clientid-";
options.ClientSecret = "-your-client-secret-from-user-secrets-or-keyvault";
options.ResponseType = "code";
options.UsePkce = true;
options.Scope.Add("profile");
options.SaveTokens = true;
});
var app = builder.Build();
// Code removed for brevity.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
options.SignInScheme = "Cookies";
options.Authority = "-your-identity-provider-";
options.RequireHttpsMetadata = true;
options.ClientId = "-your-clientid-";
options.ClientSecret = "-your-client-secret-from-user-secrets-or-keyvault";
options.ResponseType = "code";
options.UsePkce = true;
options.Scope.Add("profile");
options.SaveTokens = true;
});
var app = builder.Build();
// Code removed for brevity.
Om du behöver inaktivera namnrymderna per schema och inte globalt kan du använda alternativet MapInboundClaims = false.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
options.SignInScheme = "Cookies";
options.Authority = "-your-identity-provider-";
options.RequireHttpsMetadata = true;
options.ClientId = "-your-clientid-";
options.ClientSecret = "-your-client-secret-from-user-secrets-or-keyvault";
options.ResponseType = "code";
options.UsePkce = true;
options.MapInboundClaims = false;
options.Scope.Add("profile");
options.SaveTokens = true;
});
var app = builder.Build();
// Code removed for brevity.
Utöka eller lägga till anpassade anspråk med hjälp av IClaimsTransformation
Gränssnittet IClaimsTransformation kan användas för att lägga till extra anspråk i klassen ClaimsPrincipal. Gränssnittet kräver en enda metod TransformAsync. Den här metoden kan anropas flera gånger. Lägg bara till ett nytt anspråk om det inte redan finns i ClaimsPrincipal. En ClaimsIdentity skapas för att lägga till de nya kraven och kan läggas till i ClaimsPrincipal.
using Microsoft.AspNetCore.Authentication;
using System.Security.Claims;
public class MyClaimsTransformation : IClaimsTransformation
{
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
ClaimsIdentity claimsIdentity = new ClaimsIdentity();
var claimType = "myNewClaim";
if (!principal.HasClaim(claim => claim.Type == claimType))
{
claimsIdentity.AddClaim(new Claim(claimType, "myClaimValue"));
}
principal.AddIdentity(claimsIdentity);
return Task.FromResult(principal);
}
}
Gränssnittet IClaimsTransformation och klassen MyClaimsTransformation kan registreras som en tjänst:
builder.Services.AddTransient<IClaimsTransformation, MyClaimsTransformation>();
Mappa anspråk från externa identitetsprovidrar
Se följande dokument:
Spara ytterligare anspråk och token från externa leverantörer i ASP.NET Core
Anspråk kan skapas från alla användar- eller identitetsdata som kan utfärdas med hjälp av en betrodd identitetsleverantör eller ASP.NET Core-identitet. Ett anspråk är ett namnvärdepar som representerar vad ämnet är, inte vad ämnet kan göra. Den här artikeln beskriver följande områden:
- Konfigurera och mappa anspråk med hjälp av en OpenID Connect--klient
- Ange namn och rollbeskrivning
- Återställa anspråksnamnrymderna
- Anpassa och utöka påståendena genom TransformAsync
Mappa anspråk med OpenID Connect-autentisering
Profilanspråken kan returneras i id_token, som returneras efter en lyckad autentisering. ASP.NET Core-klientappen kräver bara profilomfånget. När du använder id_token för anspråk krävs ingen ytterligare anspråksmappning.
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
options.SignInScheme = "Cookies";
options.Authority = "-your-identity-provider-";
options.RequireHttpsMetadata = true;
options.ClientId = "-your-clientid-";
options.ClientSecret = "-your-client-secret-from-user-secrets-or-keyvault";
options.ResponseType = "code";
options.UsePkce = true;
options.Scope.Add("profile");
options.SaveTokens = true;
});
Ett annat sätt att hämta användaranspråken är att använda OpenID Connect-api:et för användarinformation. Klientprogrammet ASP.NET Core använder egenskapen GetClaimsFromUserInfoEndpoint för att konfigurera detta. En viktig skillnad jämfört med de första inställningarna är att du måste ange de anspråk som du behöver med hjälp av metoden MapUniqueJsonKey, annars kommer endast name, given_name och email standardanspråk att vara tillgängliga i klientprogrammet. Anspråken som ingår i id_token mappas som standard. Det här är den största skillnaden mot det första alternativet. Du måste uttryckligen definiera några av de anspråk som du behöver.
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
options.SignInScheme = "Cookies";
options.Authority = "-your-identity-provider-";
options.RequireHttpsMetadata = true;
options.ClientId = "-your-clientid-";
options.ClientSecret = "-your-client-secret-from-user-secrets-or-keyvault";
options.ResponseType = "code";
options.UsePkce = true;
options.Scope.Add("profile");
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.ClaimActions.MapUniqueJsonKey("preferred_username", "preferred_username");
options.ClaimActions.MapUniqueJsonKey("gender", "gender");
});
Namnkrav och rollkravsmappning
Anspråket Name och Role mappas till standardegenskaper i ASP.NET Core HTTP-kontexten. Ibland måste du använda olika anspråk för standardegenskaperna, eller namnanspråket och rollanspråket matchar inte standardvärdena. Anspråken kan mappas med hjälp av egenskapen TokenValidationParameters och ställas in på valfritt anspråk efter behov. Värdena från påståendena kan användas direkt i egenskapen HttpContext-User.Identity.Name och rollerna.
Om User.Identity.Name inte har något värde eller om rollerna saknas kontrollerar du värdena i de returnerade anspråken och anger NameClaimType och RoleClaimType värden. De returnerade anspråken från klientautentiseringen kan visas i HTTP-kontexten.
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
// other options...
options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "email",
// RoleClaimType = "role"
};
});
Anspråksnamnområden, standardnamnområden
ASP.NET Core lägger till standardnamnområden i vissa kända anspråk, vilket kanske inte krävs i appen. Du kan valfritt inaktivera de tillagda namnrymderna och använda de exakta anspråk som OpenID Connect-servern skapade.
public void Configure(IApplicationBuilder app)
{
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
Utöka eller lägga till anpassade anspråk med hjälp av IClaimsTransformation
Gränssnittet IClaimsTransformation kan användas för att lägga till extra anspråk i klassen ClaimsPrincipal. Gränssnittet kräver en enda metod TransformAsync. Den här metoden kan anropas flera gånger. Lägg bara till ett nytt anspråk om det inte redan finns i ClaimsPrincipal. En ClaimsIdentity skapas för att lägga till de nya kraven och kan läggas till i ClaimsPrincipal.
public class MyClaimsTransformation : IClaimsTransformation
{
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
ClaimsIdentity claimsIdentity = new ClaimsIdentity();
var claimType = "myNewClaim";
if (!principal.HasClaim(claim => claim.Type == claimType))
{
claimsIdentity.AddClaim(new Claim(claimType, "myClaimValue"));
}
principal.AddIdentity(claimsIdentity);
return Task.FromResult(principal);
}
}
Det IClaimsTransformation gränssnittet och klassen MyClaimsTransformation kan läggas till i metoden ConfigureServices som en tjänst.
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IClaimsTransformation, MyClaimsTransformation>();
Utöka eller lägga till anpassade anspråk i ASP.NET Core Identity
Se följande dokument:
Lägg till anspråk i Identity med hjälp av IUserClaimsPrincipalFactory
Mappa anspråk från externa identitetsprovidrar
Se följande dokument:
Spara ytterligare klagomål och tokener från externa leverantörer i ASP.NET Core
ASP.NET Core