ASP.NET核心MVC - 没有身份的Cookie中间件

时间:2016-04-09 11:02:30

标签: asp.net-mvc

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

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

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

  

问题

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

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

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

我似乎无法弄明白。你能帮帮我吗?

由于

2 个答案:

答案 0 :(得分:5)

我遇到了同样的问题。经过一些研究和调整,它起作用了...... 现在我认为问题如下。起初我将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());
    }

希望这有助于即使它有点迟了。

答案 1 :(得分:0)

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

Here is a blog post on this topic

  

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

     

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