2017-08-17 2 views
4

J'ai une application .NET Core 1.1 que je souhaite mettre à niveau vers .NET Core 2.0. Lors de la mise à jour du framework cible et de toutes les dépendances, j'ai trouvé que ma configuration d'authentification ne serait pas compilée. J'ai mis à jour pour tenir compte des propriétés supprimées et des appels de méthodes dépréciés/déplacés. Ellipses utilisées pour représenter le code omis pour la brièveté.ASP.NET Core 2.0 - ArgumentException: Options.ClientId doit être fourni

Je reçois maintenant l'erreur suivante chaque fois que je commence ma demande enter image description here

1.1 Code - intérieur méthode public void Configure() de Startup.cs

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationScheme = "Cookies", 
    ExpireTimeSpan = TimeSpan.FromHours(12), 
    SlidingExpiration = false, 
    CookiePath = CookiePath, 
    CookieName = "MyCookie" 
}); 

var openIdConnectionOptions = new OpenIdConnectOptions 
{ 
    ClientId = Configuration["OpenIdSettings:ClientId"], 
    ClientSecret = Configuration["OpenIdSettings:ClientSecret"], 
    Authority = Configuration["OpenIdSettings:Authority"], 
    MetadataAddress = $"{Configuration["OpenIdSettings:Authority"]}/.well-known/openid-configuration", 
    GetClaimsFromUserInfoEndpoint = true, 
    AuthenticationScheme = "oidc", 
    SignInScheme = "Cookies", 
    ResponseType = OpenIdConnectResponseType.IdToken, 
    TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters 
    { 
     // This sets the value of User.Identity.Name to users AD username 
     NameClaimType = IdentityClaimTypes.WindowsAccountName, 
     RoleClaimType = IdentityClaimTypes.Role, 
     AuthenticationType = "Cookies", 
     ValidateIssuer = false 
    } 
}; 

// Scopes needed by application 
openIdConnectionOptions.Scope.Add("openid"); 
openIdConnectionOptions.Scope.Add("profile"); 
openIdConnectionOptions.Scope.Add("roles"); 

app.UseOpenIdConnectAuthentication(openIdConnectionOptions); 

Tout ce que je lis montre ce processus est déplacé vers la ConfigureServices méthode. Voici mon nouveau code pour le Core 2,0

public void ConfigureServices(IServiceCollection services) 
{ 
    ... 

    services.AddAuthentication(options => 
    { 
     options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; 
     options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; 
    }).AddCookie(options => new CookieAuthenticationOptions 
    { 
     //AuthenticationScheme = "Cookies", // Removed in 2.0 
     ExpireTimeSpan = TimeSpan.FromHours(12), 
     SlidingExpiration = false, 
     Cookie = new CookieBuilder 
     { 
      Path = CookiePath, 
      Name = "MyCookie" 
     } 
    }).AddOpenIdConnect(options => GetOpenIdConnectOptions()); 

    ... 
} 

public void Configure(IApplicationBuilder app) 
{ 
    ... 
    app.UseAuthentication(); 
    ... 
} 
private OpenIdConnectOptions GetOpenIdConnectOptions() 
{ 
     var openIdConnectionOptions = new OpenIdConnectOptions 
     { 
      ClientId = Configuration["OpenIdSettings:ClientId"], 
      ClientSecret = Configuration["OpenIdSettings:ClientSecret"], 
      Authority = Configuration["OpenIdSettings:Authority"], 
      MetadataAddress = $"{Configuration["OpenIdSettings:Authority"]}/.well-known/openid-configuration", 
      GetClaimsFromUserInfoEndpoint = true, 
      SignInScheme = "Cookies", 
      ResponseType = OpenIdConnectResponseType.IdToken, 

      TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters 
      { 
       // This sets the value of User.Identity.Name to users AD username 
       NameClaimType = IdentityClaimTypes.WindowsAccountName, 
       RoleClaimType = IdentityClaimTypes.Role, 
       AuthenticationType = "Cookies", 
       ValidateIssuer = false 
      } 
     }; 

     // Scopes needed by application 
     openIdConnectionOptions.Scope.Add("openid"); 
     openIdConnectionOptions.Scope.Add("profile"); 
     openIdConnectionOptions.Scope.Add("roles"); 

     return openIdConnectionOptions; 
    } 

Je suis en train de la ClientId (ou alors je pensais) dans mon GetOpenIdConnectOptions donc je suis pas clair sur ce clientId l'erreur fait référence. enter code here

Edit: appsettings.json

"OpenIdSettings": { 
    "Authority": "https://myopenidauthenticationendpointurl", 
    "ClientId": "myappname", 
    "CookiePath": "mypath" 
} 
+0

Est-ce que [ 'configuration "OpenIdSettings: clientId"]' une valeur? –

+0

Ajout d'une modification à la publication originale avec la section 'OpenIdSettings' de appsetting.json – tralmix

Répondre

3

.AddOpenIdConnect (options => GetOpenIdConnectOptions());

Votre aide retourne une nouvelle instance OpenIdConnectOptions au lieu de mettre à jour l'objet pour vous options préparé par le délégué options => ....

fixer votre méthode pour prendre une valeur OpenIdConnectOptions existante et il devrait fonctionner:

services.AddAuthentication(options => 
{ 
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; 
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; 
}).AddCookie(options => new CookieAuthenticationOptions 
{ 
    //AuthenticationScheme = "Cookies", // Removed in 2.0 
    ExpireTimeSpan = TimeSpan.FromHours(12), 
    SlidingExpiration = false, 
    Cookie = new CookieBuilder 
    { 
     Path = CookiePath, 
     Name = "MyCookie" 
    } 
}) 
.AddOpenIdConnect(options => SetOpenIdConnectOptions(options)); 

private void SetOpenIdConnectOptions(OpenIdConnectOptions options) 
{ 
    options.ClientId = Configuration["OpenIdSettings:ClientId"]; 
    options.ClientSecret = Configuration["OpenIdSettings:ClientSecret"]; 
    options.Authority = Configuration["OpenIdSettings:Authority"]; 
    options.MetadataAddress = $"{Configuration["OpenIdSettings:Authority"]}/.well-known/openid-configuration"; 
    options.GetClaimsFromUserInfoEndpoint = true; 
    options.SignInScheme = "Cookies"; 
    options.ResponseType = OpenIdConnectResponseType.IdToken; 

    options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters 
    { 
     // This sets the value of User.Identity.Name to users AD username 
     NameClaimType = IdentityClaimTypes.WindowsAccountName, 
     RoleClaimType = IdentityClaimTypes.Role, 
     AuthenticationType = "Cookies", 
     ValidateIssuer = false 
    }; 

    // Scopes needed by application 
    options.Scope.Add("openid"); 
    options.Scope.Add("profile"); 
    options.Scope.Add("roles"); 
} 
+1

Merci. L'authentification fonctionne à nouveau parfaitement. – tralmix