在ASP.NET Core中未经授权时重定向到登录

时间:2016-10-24 11:49:00

标签: c# asp.net asp.net-core asp.net-identity asp.net-core-mvc

在之前的ASP.NET MVC中,如果用户未经过身份验证,则可以选择重定向到登录操作。

我需要与ASP.NET Core相同的东西,所以我:

  1. 从Visual Studio模板
  2. 创建了一个ASP.NET Core项目
  3. [Authorize]添加到某个任意操作
  4. 在浏览器中打开相应的视图
  5. 我不希望重定向,因为我还没有配置它。但是,它会自动重定向到登录操作!

    此选项设置在何处/如何设置?

7 个答案:

答案 0 :(得分:8)

使用当前的aspnet核心版本(2.1.0),这已经改变,现在使用可以使用扩展:

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

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

您可以详细了解如何迁移到2.0 in this article

答案 1 :(得分:4)

对于任何有兴趣的人,也可以使用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版本

答案 2 :(得分:2)

您可以使用CookieAuthenticationOptions类配置路径。

像这样。

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

答案 3 :(得分: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;
    });

答案 4 :(得分: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");
        });

答案 5 :(得分:0)

放置在配置中间件管道中应该很重要。

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();
        });

答案 6 :(得分:-2)

您不需要添加Cookie身份验证。使其保持DRY状态,并使用所需的内容初始化内置的身份验证表单。

第1步:制作具有个人授权的脚手架.NET Core 2.1 Web应用程序:

dotnet new mvc -o YourAppName --auth Individual

第2步:假设您的受保护视图位于名为ClockinController的控制器中,则可以这样指定重定向:

@* from _LoginPartial.cshtml change this line *@
        <li><a asp-area="Identity" asp-page="/Account/Login" asp-route-returnUrl="@Url.Action("Index", "Clockin")">Login</a></li>

如果需要为returnUrl添加条件逻辑,则可以选择调用JavaScript函数。