У меня есть бритвенное приложение, использующее Azure B2 C, которое я разрабатывал уже некоторое время. Кнопка входа не работала, поэтому я создал новое приложение с помощью мастера по умолчанию, и это приложение работает, если я меняю локальный хост в приложении azure. Я пытаюсь найти разницу между этими двумя приложениями.
Они оба имеют идентичные файлы _LoginPartial.cs html и одинаковые настройки в файле макета для кнопки входа, но те, которые не работают не имеет данных href для вызова учетной записи. Когда я смотрю в отладчике f12, ссылка для входа выглядит так: <a class="nav-link text-dark" href>Sign in</a>
Работающее приложение отображает его так: <a class="nav-link text-dark" href="/AzureADB2C/Account/SignIn">Sign in</a>
, что, очевидно, намного лучше.
оба работают под управлением Microsoft.AspNetCore. Authentication.AzureADB2 C .UI через пакеты nuget.
у сломанного приложения есть много других вещей, очевидно, что новое нет, telerik, azure storage, sql, entity framework et c но все выглядит одинаково в конфигурации config et c для входа в систему. Я включил запуск et c ниже сломанной версии на случай, если это поможет. Кто-нибудь может определить проблему?
LoginPartial:
@using Microsoft.AspNetCore.Authentication.AzureADB2C.UI
@using Microsoft.Extensions.Options
@inject IOptionsMonitor<AzureADB2COptions> AzureADB2COptions
@{
var options = AzureADB2COptions.Get(AzureADB2CDefaults.AuthenticationScheme);
}
<ul class="navbar-nav">
@if (User.Identity.IsAuthenticated)
{
@if (!string.IsNullOrEmpty(options.EditProfilePolicyId))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="AzureADB2C" asp-controller="Account" asp-action="EditProfile">
<span class="text-dark">Hello @User.Identity.Name!</span>
</a>
</li>
}
else
{
<li class="nav-item">
<span class="navbar-text text-dark">Hello @User.Identity.Name!</span>
</li>
}
<li class="nav-item">
<a class="nav-link text-dark" asp-area="AzureADB2C" asp-controller="Account" asp-action="SignOut">Sign out</a>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="AzureADB2C" asp-controller="Account" asp-action="SignIn">Sign in</a>
</li>
}
</ul>
launchsettings
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:50209",
"sslPort": 44370
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"FliveRetry": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
appsettings
{
"AzureAdB2C": {
"Instance": "https://xxxx.b2clogin.com/tfp/",
"ClientId": "xxxx-xx-xx-xx-xx",
"CallbackPath": "/signin-oidc",
"Domain": "xxxx.onmicrosoft.com",
"SignUpSignInPolicyId": "B2C_1_signupsignin",
"ResetPasswordPolicyId": "B2C_1_resetpassword",
"EditProfilePolicyId": "B2C_1_editprofile"
},
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"FliveRetryContext": "Server=(localdb)\\mssqllocaldb;Database=xxxx-566cf99c-25d6-42a3-9260-5626bc8829b2;Trusted_Connection=True;MultipleActiveResultSets=true",
}
}
startup.cs
using System;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.AzureADB2C.UI;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json.Serialization;
using System.Globalization;
using Microsoft.AspNetCore.Localization;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Mvc;
using FliveRetry.Models;
using FliveRetry.Models.PTs;
using FliveRetry.Data;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.HttpsPolicy;
namespace FliveRetry
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDistributedMemoryCache();
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromMinutes(30);
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
options.Cookie.Name = ".Flive";
});
services.AddMemoryCache();
services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
.AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options));
services.AddRazorPages().AddNewtonsoftJson
(options => {
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});
services.AddDbContext<FliveRetryContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("xxxxx")));
services.AddRazorPages();
services.AddMvc()
.AddNewtonsoftJson(options =>
options.SerializerSettings.ContractResolver =
new DefaultContractResolver());
services.AddMvc();
services.AddMvc().AddRazorRuntimeCompilation();
services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
services.AddScoped<IPtNoteRepository, PtNoteRepository>();
//services.AddSingleton<PtNoteRepository>();
// Add Kendo UI services to the services container
services.AddKendo();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
var supportedCultures = new[] { new CultureInfo("en-AU") };
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-AU"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
//app.UseHttpContextItemsMiddleware();
app.UseRouting();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
app.UseStaticFiles();
app.UseSession();
}
}
}