ASP.NET核心MVC-Cookie中间件,不带标识



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

1/删除任何涉及身份的内容

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

问题

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

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

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

我似乎想不通。你能帮我吗?

感谢

我也遇到了同样的问题。经过一些研究和调整,它奏效了。。。现在我认为问题出在以下方面。起初,我让委托人按照以下进行构建

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

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

发生这种情况是因为您用于创建新的ClaimsIdentity实例的构造函数。如果未指定身份验证类型,则IsAuthenticated属性设置为false,这将导致您描述的错误。

这是一篇关于这个主题的博客文章

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

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

最新更新