【问题标题】:ASP.NET Core MVC - Cookie Middleware w/o IdentityASP.NET Core MVC - 没有身份的 Cookie 中间件
【发布时间】:2016-07-30 16:18:28
【问题描述】:

我想修改默认 Web 应用程序模板以使用 Cookie 身份验证而不是身份。所以这就是我所做的:

1/ 删除任何涉及身份的东西

2/ 遵循本指南https://docs.asp.net/en/latest/security/authentication/cookie.html

问题

当我尝试访问受限资源 (/Home/Secret) 时,我被重定向到登录页面 => 正确行为

我输入电子邮件/密码并提交 => 在客户端创建的名为 .AspNet.MyCookieMiddlewareInstance 的 cookie => 正确的行为

但后来我被重定向到 Account/AccessDenied 而不是 /Home/Secret/Account/AccessDenied 来自哪里?

我似乎无法弄清楚。你能帮帮我吗?

谢谢

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    我遇到了同样的问题。经过一些研究和调整,它起作用了...... 现在我认为问题如下。起初我的 Principal 构造如下

     var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(myclaims));
    

    其实应该是这样的

     var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(myclaims, "MyCookieMiddlewareInstance"));
    

    现在显然必须设置此字符串“MyCookieMiddlewareInstance”。
    这也是完整的配置和控制器:
    在 Startup.cs 中

    public void Configure(IApplicationBuilder app)
        {
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationScheme = "MyCookieMiddlewareInstance",
                LoginPath = new PathString("/Auth/Login"),
                AccessDeniedPath = new PathString("/Auth/Denied"),
                AutomaticAuthenticate = true,
                AutomaticChallenge = true
            });
    
    
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    "default",
                    "{controller=Home}/{action=Index}/{id?}");
            });
        }
    

    然后在 AuthController.cs 中

    [HttpPost]
        public ActionResult Login(LoginModel model)
        {
            if (model.Username == "test" && model.Password == "pass")
            {
                var myclaims = new List<Claim>(new Claim[] { new Claim("Id", "SOME USER ID FROM SOMEWHERE!!") });
    
                var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(myclaims, "MyCookieMiddlewareInstance"));
    
                HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", claimsPrincipal).Wait();
    
                return RedirectToAction("Index", "Home");
            }
    
            return View(new LoginModel());
        }
    

    希望这会有所帮助,即使有点晚了。

    【讨论】:

      【解决方案2】:

      这是因为您使用构造函数来创建新的 ClaimsIdentity 实例。如果不指定身份验证类型,IsAuthenticated 属性设置为 false,会导致您描述的错误。

      Here is a blog post on this topic

      现在可以创建具有声明但 IsAuthenticated 设置为 false 的 ClaimsIdentity。 ... 要将 IsAuthenticated 设置为 true,您需要在 ctor 中指定身份验证类型:

      var id = new ClaimsIdentity(claims, “Custom”);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-30
        相关资源
        最近更新 更多