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 ответ:
.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"); }