programing

ASP에서 인증되지 않은 경우 로그인으로 리디렉션합니다.NET 코어

batch 2023. 8. 29. 20:16
반응형

ASP에서 인증되지 않은 경우 로그인으로 리디렉션합니다.NET 코어

이전 ASP에서.NET MVC, 사용자가 인증되지 않은 경우 로그인 작업으로 리디렉션하는 옵션이 있습니다.

저는 ASP와 같은 것이 필요합니다.NET Core, 그래서 I:

  1. ASP를 만들었습니다.Visual Studio 템플릿의 NET Core 프로젝트
  2. 추가된[Authorize]어떤 자의적인 행동으로.
  3. 브라우저에서 해당 보기를 열었습니다.

구성하지 않았기 때문에 리디렉션을 기대하지 않습니다.그러나 자동으로 로그인 작업으로 리디렉션됩니다!

이 옵션은 어디서/어떻게 설정됩니까?

현재 aspnet core 버전(2.1.0)에서는 이 기능이 변경되었으므로 다음 확장을 사용할 수 있습니다.

   services.ConfigureApplicationCookie(options => options.LoginPath = "/login");

또는

 services
         .AddAuthentication()
         .AddCookie(options =>
         {
             options.LoginPath = "/login";
             options.LogoutPath = "/logout";
         });

2.0으로 마이그레이션하는 방법에 대한 자세한 내용은 이 문서를 참조하십시오.

리디렉션이 내 앱에서 전혀 작동하지 않았고 여기 있는 솔루션 중 수정된 것은 없지만 사용 중입니다.Status Code Pages실행:

app.UseStatusCodePages(async context => 
{
    var response = context.HttpContext.Response;

    if (response.StatusCode == (int)HttpStatusCode.Unauthorized ||
            response.StatusCode == (int)HttpStatusCode.Forbidden)
        response.Redirect("/Authentication");
});

app.UseMvc(...        

다음을 사용하여 경로를 구성할 수 있습니다.CookieAuthenticationOptions학급.

이런 거.

app.UseCookieAuthentication(new CookieAuthenticationOptions {
        LoginPath = new PathString("/Login/"),
        AuthenticationType = "My-Magical-Authentication",
        // etc...
        },
});

쿠키 인증 처리기에 대한 업데이트된 링크입니다.

관심이 있는 모든 사용자는 AddIdentity 서비스 공급자를 통해 이 작업을 수행할 수도 있습니다.

services.AddIdentity<User, IdentityRole>(options =>
    {
        options.Cookies.ApplicationCookie.AutomaticAuthenticate = true;
        options.Cookies.ApplicationCookie.AutomaticChallenge = true;
        options.Cookies.ApplicationCookie.LoginPath = "/Auth/Login";
    })
    .AddEntityFrameworkStores<MehandiContext>()
    .AddDefaultTokenProviders();

그리고 여기서 설명하는 것처럼: https://stackoverflow.com/a/41643105/5784635

저는 2017년 4월에 이것을 시도했고 그리고."Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.1.0"리다이렉트가 되지 않아요. 저는 그것을 사용해야 했습니다.1.0.1버전

시작 파일의 이 코드 블록은 에서 작동합니다.Net Core 3.1

services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

        options.LoginPath = "/Identity/Account/Login";
        options.AccessDeniedPath = "/Identity/Account/AccessDenied";
        options.SlidingExpiration = true;
    });

닷넷 코어가 쿠키 인증을 구성하는 방법은 아이덴티티 프레임워크를 사용하는 것입니다.새로운 프로젝트의 경우 명령줄로 이동하여 다음과 같은 작업을 수행하는 것이 좋습니다.

dotnet new mvc -o ExampleProject --auth Individual

Startup.cs 에서 다음 방법을 다음과 같이 수정하여 인증 프로세스를 완전히 제어할 수 있습니다.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<IdentityUser, IdentityRole>()
        // services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
        .AddRazorPagesOptions(options =>
        {
            options.AllowAreas = true;
            options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
            options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
        });

    services.ConfigureApplicationCookie(options =>
    {
        options.LoginPath = $"/Identity/Account/Login";
        options.LogoutPath = $"/Identity/Account/Logout";
        options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
    });

    // using Microsoft.AspNetCore.Identity.UI.Services;
    services.AddSingleton<IEmailSender, EmailSender>();
}

참조: https://learn.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-2.2&tabs=visual-studio#full

개인적으로 선호하는 인증은 IdentityServer4의 하이브리드 흐름으로, 단일 로그온을 사용하여 여러 애플리케이션을 구성할 수 있는 범위를 제공합니다.

배치는 구성 미들웨어 파이프라인에서 중요해야 합니다.

app.UseSession();
        app.UseAuthentication();
        app.UseStatusCodePages(context => {
            var response = context.HttpContext.Response;
            if (response.StatusCode == (int)HttpStatusCode.Unauthorized ||
                response.StatusCode == (int)HttpStatusCode.Forbidden)
                response.Redirect("/Login");
            return Task.CompletedTask;
        });
        app.UseClaimsMiddleware();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Login}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });

위의 코드는 spnet core 3.1에서 Identity Authentication을 사용하는 경우에 잘 작동합니다.

  1. 먼저 다음 코드를 Startup.cs 파일에 추가해야 합니다.
services.ConfigureApplicationCookie(options =>
{
     options.Cookie.Name = ".AspNetCore.Identity.Application";
     options.AccessDeniedPath = "/User/PageNotAllowed";               
});
  1. 컨트롤러에서 사용자 계정 관리를 담당하는 작업 생성(내 경우 User 클래스)
public IActionResult PageNotAllowed()
{
    return View();
}
  1. 마지막 단계는 다음을 생성하기만 생성하면 됩니다.PageNotAllowed당신의 취향에 맞게 보세요.

기본적으로 "로그인" 페이지는 "계정" 폴더에 배치되어야 하고 페이지는 "계정/로그인"과 같이 "로그인"이라고 불러야 하기 때문에 응용프로그램이 로그인 페이지의 위치를 알고 있는 이유

따라서 "계정" 폴더를 "계정 폴더"와 같은 다른 폴더로 변경하면 페이지를 찾을 수 없다는 http 404가 표시됩니다.

로그인 페이지가 "Program.cs " 파일로 이동할 위치를 명시적으로 지정하려면 다음 "LoginPath" 정의를 추가합니다.

builder.Services.AddAuthentication().AddCookie("YourCookieName", options =>
{
    options.Cookie.Name = "YourCookieName";
    options.LoginPath = "/Account/Login";
});

위의 예는 .NET 6에서 가져온 것입니다.

언급URL : https://stackoverflow.com/questions/40217623/redirect-to-login-when-unauthorized-in-asp-net-core

반응형