ASP.NET Core 2.0-ArgumentException: параметры.Параметр ClientID должны быть обеспечены


У меня есть приложение .NET Core 1.1, которое я хочу обновить до .NET Core 2.0. После обновления целевой платформы и всех зависимостей я обнаружил, что моя настройка аутентификации не компилируется. Я обновил для учета удаленных свойств и устаревших / перемещенных вызовов методов. Многоточие используется, чтобы представить код опущен для краткости.

Теперь я получаю следующую ошибку при каждом запуске приложенияВведите описание изображения здесь

1.1 код-внутри метода запуска public void Configure().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);
Все, что я читаю, показывает, что этот процесс перешел к методу ConfigureServices. Вот мой новый код для 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;
    }

Я устанавливаю ClientId (или так я думал) в моем GetOpenIdConnectOptions, поэтому мне неясно, на какой ClientId ссылается ошибка.enter code here

Править: appsettings.json

"OpenIdSettings": {
  "Authority": "https://myopenidauthenticationendpointurl",
  "ClientId": "myappname",
  "CookiePath":  "mypath"
}
1 4

1 ответ:

.AddOpenIdConnect(options => GetOpenIdConnectOptions ());

Ваш помощник GetOpenIdConnectOptions() возвращает новый экземпляр OpenIdConnectOptions вместо обновления объекта options, подготовленного для вас делегатом options => ....

Исправьте свой метод, чтобы принять существующее значение OpenIdConnectOptions, и он должен работать:

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");
}