Я пытаюсь внедрить единый вход, разделяя файлы cookie между двумя приложениями net core 3.1. Я перешел по этой ссылке . Я пытаюсь реализовать это путем совместного использования файлов cookie между приложениями, как указано в ссылке.
Моя идея заключается в том, что если пользователь не авторизован, он не должен иметь возможность просматривать страницу второго индекса (просмотра). Он должен перенаправить себя на страницу входа в первом приложении и успешно войти в систему, после чего он сможет увидеть страницу. если пользователь уже вошел в систему, он должен сразу показать страницу. Это моя идея.
Мой вопрос:
Как перенаправить его на страницу входа? Два веб-приложения - это разные приложения.
Мой код указан ниже. Но это не перенаправляет его. Мое первое приложение, которое является файлом Login APP Startup.cs
, выглядит следующим образом
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddAuthentication("Identity.Application")
.AddCookie("Identity.Application", options =>
{
options.Cookie.Name = ".AspNet.SharedCookie";
options.Cookie.Path = "/Home/Login";
});
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"C:\Users\Yourname\AppData\Local\ASP.NET\DataProtection-Keys"))
.SetApplicationName("SharedCookieApp");
services.AddDataProtection()
.ProtectKeysWithDpapi();
services.ConfigureApplicationCookie(options => {
options.Cookie.Name = ".AspNet.SharedCookie";
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Login}/{id?}");
});
}
}
HomeController:
public ActionResult Login()
{
var userClaims = new List<Claim>()
{
new Claim(ClaimTypes.Name,"Bob"),
};
var usrIdentity = new ClaimsIdentity(userClaims, "userIdentity");
var usrPrinci = new ClaimsPrincipal(new[] { usrIdentity });
HttpContext.SignInAsync(usrPrinci);
return View();
}
Вид входа в систему:
@{
ViewBag.Title = "Login";
}
<h2>Login</h2>
@Html.ValidationSummary()
@Html.AntiForgeryToken()
<div class="form-group">
@Html.Label("Username")
@Html.Editor("UserName")
</div>
<div class="form-group">
@Html.LabelForModel("Password")
@Html.Password("Password")
</div>
<input class="btn btn-primary" type="submit" value="Login" />
Второе приложение:
StartUp.cs
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.AddControllersWithViews();
services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(@"C:\Users\yourname\AppData\Local\ASP.NET\DataProtection-Keys"))
.SetApplicationName("SharedCookieApp");
services.AddDataProtection()
.ProtectKeysWithDpapi();
services.AddAuthentication("Identity.Application")
.AddCookie("Identity.Application", options =>
{
options.Cookie.Name = ".AspNet.SharedCookie";
options.LoginPath = "/Home/Login";
options.SlidingExpiration = true;
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
Home:
[Authorize(AuthenticationSchemes = "Identity.Application")]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
Просмотр:
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
</div>
Во втором приложении я устанавливаю Options.LoginPath
в Startup.cs
для входа в предыдущее приложение View. Но он не перенаправляет его.
Приходит ошибка:
Веб-страница для этого адреса не найдена: https://localhost: **** ** / Главная / Вход? ReturnUrl =% 2F
Значение порта выше не изменяется. Значение порта в приведенном выше URL-адресе соответствует значению второго приложения. В идеале это должно измениться на значение первого порта приложения.
Кто-нибудь может подсказать, чего не хватает в коде?