了解Mvc核心身份

时间:2018-11-01 23:37:14

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

我一直在寻找解释,但是关于身份如何与mvc core一起工作的解释却很短。我已经找到了很多有关如何实现它的指南,并且我都拥有,并且都很好用,但是我想至少在高层次上了解它。

我目前的理解是,当用户通过其凭据时,身份库将颁发令牌,并将该令牌写入浏览器的cookie。现在,所有其他请求都将基于该浏览器cookie来标识用户。但是,我似乎找不到任何解释。为什么这样安全?为什么我不能窃取该cookie并将其作为自己的cookie?我知道这还不止如此,可能我已经理解了上面的错误部分。

无论如何,我正在寻找有关其工作原理的高级解释,或者是可以深入研究细节的良好参考。

1 个答案:

答案 0 :(得分:3)

  

身份如何与mvc core一起工作。

正如@ Chris Pratt所说,您所谈论的是安全子系统。由于您在谈论cookie,因此我将以cookie的身份验证方案为例。

内置安全性主要存在于四个项目中:

  • HttpAbstractions:核心接口和类,例如身份验证方案,身份验证处理程序,身份验证票证等。
  • Security:身份验证中间件,cookie身份验证,JWT Bearer身份验证,OAuth2.0身份验证(Google / Facebook / Microsoft / ...)等等。
  • Identity:一个名为“ Identity”的脚手架项目,可帮助管理用户/角色/索偿/等。
  • DataProtection:用于保护和取消保护数据的数据保护API。您可以将其视为用于加密和解密的API。

了解身份验证如何工作的切入点是AuthenticationMiddleware。如果可能,此中间件将尝试验证每个请求:

    public async Task Invoke(HttpContext context)
    {
        // ...

        // Give any IAuthenticationRequestHandler schemes a chance to handle the request
        var handlers = context.RequestServices.GetRequiredService<IAuthenticationHandlerProvider>();
        foreach (var scheme in await Schemes.GetRequestHandlerSchemesAsync())
        {
            var handler = await handlers.GetHandlerAsync(context, scheme.Name) as IAuthenticationRequestHandler;
            if (handler != null && await handler.HandleRequestAsync())
            {
                return;
            }
        }

        // Use the default scheme to authenticate request
        var defaultAuthenticate = await Schemes.GetDefaultAuthenticateSchemeAsync();
        if (defaultAuthenticate != null)
        {
            var result = await context.AuthenticateAsync(defaultAuthenticate.Name);
            if (result?.Principal != null)
            {
                context.User = result.Principal;
            }
        }

        await _next(context);
    }

通常,此中间件在其他中间件/ mvc之前运行,因此您可以根据需要拦截请求。

如果您想访问受url保护的[Authorize]而无需登录,它将要求您通过某种方案登录。您可以根据需要将服务配置为使用不同的方案,例如Jwt Bearer,Cookie等。

如果您使用Cookie方案, CookieAuthenticationHandler会很繁重:

  • Signin:当您认为您已经验证了用户主体时,将发出一个新的cookie。
  • Authenticate:验证客户端发送的cookie
  • Signout:删除cookie

请注意,所有这些操作都是由Microsoft.AspNetCore.Authentication.Cookies/CookieAuthenticationHandler完成的,即由aspnet/Security定义的处理程序,而不是aspnet/Identity

  

为什么我不能窃取该cookie并将其作为自己的cookie?

  1. 当然,您可以窃取某人的cookie并将其用作您自己的cookie。实际上,如果鲍勃(例如通过XSSsniffering盗窃了爱丽丝的cookie,鲍勃将被视为爱丽丝。 ASP.NET Core(以及其他技术,例如PHP / Python / Java)无法阻止这种情况,要防止这种偷窃,还有很多工作要做:

    • 网站应使用HTTPS而不是HTTP
    • 编码<><img onclick='javascript:'等字符以防止XSS
    • ...
  2. 此外,您有时不需要窃取某人的cookie。通过CSRF,您只需“借用”他的cookie。

  

为什么这样安全

通常,即使理论上有可能窃取某人的cookie或借用某人的cookie,也只有在您以错误的方式开发应用程序或以不安全的方式部署应用程序时才会发生。

另一件事是,您几乎无法在客户端伪造Cookie。