options.ClientId = myOptions.ClientId;
options.ClientSecret = myOptions.ClientSecret;
options.Authority = myOptions.Domain;
options.CallbackPath = new PathString(myOptions.CallbackPath ?? options.CallbackPath);
options.SignedOutCallbackPath = myOptions.SignedOutCallbackPath ?? options.SignedOutCallbackPath;
options.ResponseType = myOptions.ResponseType;
options.SignInScheme = myOptions.CookieSchemeName;
var keyAsBytes = Encoding.UTF8.GetBytes(myOptions.ClientSecret);
var issuerSigningKey = new SymmetricSecurityKey(keyAsBytes);
// Set the correct name claim type
options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
IssuerSigningKey = issuerSigningKey
};
и OnTicketReceived возвращает информацию о претензиях.
OnTicketReceived = context =>
{
var user = context.Principal;
var httpContext = context.HttpContext;
return Task.FromResult(0);
},
Но в HomeController.cs. User.Identity.IsAuthenticated возвращает false, а User.Identity.claims.count () равно 0.
public IActionResult Index()
{
if (User.Identity.IsAuthenticated)
{
//authenticated
}else{
//not authenticated
}
Но приведенный выше случай имеет место только тогда, когда у меня настроено несколько провайдеров. Нравится. В противном случае, если один поставщик, он работает как шарм. Только несколько провайдеров. Я сделал разные URI перенаправления и схемы cook ie и openid разные для каждого провайдера. Чего мне не хватает?
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
// services.AddAntiforgery();
services.AddDataProtection();
services.AddSession(options =>
{
// Set a short timeout for easy testing.
options.IdleTimeout = TimeSpan.FromSeconds(180);
options.Cookie.HttpOnly = true;
// Make the session cookie essential
options.Cookie.SameSite = SameSiteMode.Lax;
options.Cookie.IsEssential = true;
options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
});
//azure ad - if this one is defined alone it works but when added the one below it doesn't
//signin in to the cookie or the client. But the IDP signs in and returns claim
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => Configuration.GetSection(Providers.AzureAD).Bind(options));
//corporate AD - if specified alone without Azure AD works. But if both defined it fails.
services.AddAuthentication(CorporateADDefaults.AuthenticationScheme)
.AddCorporateAD(options => Configuration.GetSection(Providers.CorporateAD).Bind(options));
services.AddAuthorization(o => o.AddPolicy("Denied", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.RequireAssertion(ahc => false)
.Build()));
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}) );
services.AddMvc(options => options.EnableEndpointRouting = false)
.SetCompatibilityVersion(CompatibilityVersion.Version_3_0).AddRazorPagesOptions(o =>
o.Conventions.AuthorizePage("/About", "Denied"))
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
// app.UseStaticFiles();
// app.UseCookiePolicy();
// app.UseAuthentication();
//app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCors("MyPolicy");
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute();
endpoints.MapRazorPages();
});
}
В Appsettings - конфигурация настроена так:
"AzureAD": {
"ClientId": "*******************",
"Domain": "mydomain.onmicrosoft.com",
"Instance": "https://login.microsoftonline.com/",
"TenantId": "*********************",
"CallbackPath": "/signin-azuread",
"ClientSecret": "*******************",
},
"CorporateAD": {
"ClientId": "*******************",
"Domain": "mydomain.CorporateADDomain.com",
"CallbackPath": "/signin-oidc",
"ClientSecret": "*******************",
}
У меня разные обработчики для каждого типа. Но код упоминается сверху.
Пожалуйста, мне потребовалось значительное время, чтобы выяснить, что происходит.