领先技术 您所在的位置:网站首页 asp身份验证和授权运行截图 领先技术

领先技术

2024-06-28 22:20| 来源: 网络整理| 查看: 265

项目 10/04/2017

2017 年 9 月

第 32 卷,第 9 期

此文章由机器翻译

领先技术 - ASP.NET Core 中的 Cookie、声明和身份验证

通过 Dino Esposito | 自 2017 年 9 月

有关 ASP.NET 核心中的身份验证主题的资料的大多数重点介绍 ASP.NET Identity framework 使用。在该上下文中,内容似乎很多或更改,更确切地说,所有基础结构中发生的更改具有已隐藏在框架的折叠,以便它看上去几乎相同图面上。

如果你看一下用户身份验证在 ASP.NET Core 外部喜欢区域的 ASP.NET 标识,你可能会发现它过去版本中已有很大不同。ASP.NET 标识是如果你只需通过简单的数据库表中的纯文本凭据的用户进行身份验证是一种浪费的完备、 全面的大框架。在这种情况下,你将看到到身份验证的总体方法仍基于熟悉的概念,如主体、 登录窗体、 质询和授权属性,唯一的差别在于实现它们的方式从根本上不同。在本月的列中,我将探讨 cookie 身份验证 API,如在 ASP.NET Core,包括外部身份验证的核心事实数据中可用。

ASP.NET 身份验证的基础

在 ASP.NET 中,用户身份验证涉及使用 cookie。尝试访问私有页面任何用户都重定向到登录页,如果它们不包含有效的身份验证 cookie。登录页上,验证提供 creden tials 后, 发出该 cookie,然后提供与任何后续请求的同一浏览器通过该用户从直至其过期。这是你可能知道从以前版本的 ASP.NET 的相同基本工作流。在 ASP.NET 核,它仅查找不同由于不同的中间件和运行时环境的不同配置。

有两个主要更改在 ASP.NET Core 对于那些来自 ASP.NET Web 窗体和 ASP.NET MVC 的背景。首先,不再 web.config 文件中,这意味着该配置登录路径,cookie 名称,并以不同的方式检索过期。其次,IPrincipal 对象 — 用于与模型的用户标识的对象-现在基于声明,而不是普通的用户名。若要启用 cookie 中全新的 ASP.NET Core 1.x 应用程序的身份验证,首先引用 Microsoft.AspNetCore.Authentication.Cookies 包,并将中的代码段图 1。

图 1 注册 Cookie 身份验证中间件

// This code is for ASP.NET Core 1.x public void Configure(IApplicationBuilder app) { app.UseCookieAuthentication(new CookieAuthenticationOptions { AutomaticAuthenticate = true, AutomaticChallenge = true, AuthenticationScheme = "Cookies", CookieName = "YourAppCookieName", LoginPath = new PathString("/Account/Login"), ExpireTimeSpan = TimeSpan.FromMinutes(60), SlidingExpiration = true, ReturnUrlParameter = "original", AccessDeniedPath = new PathString("/Account/Denied") }); }

大部分经典存储在 web.config 文件的 < 身份验证 > 部分中的 ASP.NET MVC 应用程序被配置为中间件选项的信息。中的代码段图 1 comprehends 规范你可能想要选择的选项。图 2说明每个更多详细信息。

图 2 Cookie 身份验证选项

属性 说明 AccessDeniedPath 指示在其中已经过身份验证的用户将重定向如果提供的标识不具有查看请求的资源的权限的路径。获取 HTTP 403 状态代码与相同。 AutomaticAuthenticate 指示该中间件运行对每个请求,然后尝试验证 cookie 并生成从内容标识对象。 AutomaticChallenge 指示该中间件将浏览器重定向到登录页是否用户未经过身份验证,或者如果身份验证但未在请求的资源授权用户,则访问拒绝页。  AuthenticationScheme 中间件的名称。此属性与结合工作 AutomaticChallenge 来有选择地选取基于每个请求的身份验证中间件。 CookieName 正在创建的身份验证 cookie 的名称。 ExpireTimeSpan 设置身份验证 cookie 的到期时间。由 SlidingExpiration 属性的值确定是否时间必须为绝对或相对应。 LoginPath 指示在其中匿名用户将重定向以使用她自己的凭据登录的路径。 ReturnUrlParameter 正在用来传递最初请求的 URL 导致的重定向至登录页发生匿名用户的参数名称。 SlidingExpiration 指示 ExpireTimeSpan 值是绝对或相对。在后一种情况下,值视为一个时间间隔和中间件将如果一半以上间隔过后重新发出该 cookie。

请注意,路径属性不是字符串类型。LoginPath 和 AccessDeniedPath 属于类型 PathString,这与普通字符串类型相比,提供正确转义,生成的请求 URL 时。

ASP.NET 核心中的用户身份验证工作流的总体设计可灵活 bility 空前量。可以在将自定义它的每个方面。例如,我们来看,你可以如何控制正在使用基于每个请求身份验证工作流。

处理多个身份验证方案

通过将 AutomaticChallenge 设置为 false,指示无法由每个构成,例如,重定向响应的 [Authorize] 挑战的中间件。如果任何中间件将不处理所面临的挑战是引发异常。自动难题是 ASP.NET 的过去版本中 norm 和没有几乎可以执行有关它的任何内容。

你可以在 ASP.NET Core 注册多个和身份验证中间件的不同部分,并确定算法或通过配置的中间件要用于每个请求都有。当使用多个身份验证中间件,则自动进行身份验证可以是多个中间件则为 true。AutomaticChallenge,相反,应仅启用在零个或一个中间件。有关更多详细信息,请参阅bit.ly/2tS07Sm。

身份验证中间件的常见示例是基于 cookie 的身份验证、 持有者身份验证,通过社交网络的身份验证或标识服务器和任何其他你曾认为来实现。假设在你启动类配置方法有以下代码:

app.UseCookieAuthentication(new CookieAuthenticationOptions() { AuthenticationScheme = "Cookies", LoginPath = new PathString("/Account/Login/"), AutomaticAuthenticate = true }); app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions { AuthenticationScheme = "Bearer", AutomaticAuthenticate = true }

请注意存在要用于取代神奇的字符串,例如"Cookie"只是为了限制拼写有误的常量。具体而言,可以按如下所示替换为字符串"Cookie":

AuthenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme

请注意,UseIdentityServerAuthentication 不是 ASP.NET Core framework 的一部分,但属于标识服务器 framework (请参阅github.com/IdentityServer)。若要选择基于每个请求的身份验证方案,你使用的新特性上 Authorize 属性,在 ASP.NET MVC 将标记为进行身份验证和授权的操作:

[Authorize(ActiveAuthenticationSchemes = "Bearer")] public class ApiController : Controller { // Your API action methods here ... }

代码片段的净效果是用户的已经过身份验证通过持有者令牌,将示例 ApiController 类的所有公共终结点受到标识。

建模的用户标识

在 ASP.NET 中,IPrincipal 接口定义的软件协定定义的用户标识的核心。登录的用户通过 HttpContext 控制器属性的 User 属性公开。IPrincipal 具有相同的实现在 ASP.NET 4.x (包括 ASP.NET MVC) 和 ASP.NET Core。但是,在 ASP.NET 核心中默认主体对象并非 GenericPrincipal,但新 ClaimsPrincipal 类型。区别在于相关。

GenericPrincipal 以上用户信息的一种-用户名-即使自定义用户数据可以添加到在 cookie 中加密的身份验证票证。多年来,唯一的用户名已变得过少的现代应用程序的需求。该角色的用户,以及某些其他大量信息,大多数显著图和显示名称,显示绝对必要今天,强制每个实际的应用程序,以便为每个和每个创建其自己自定义主体类型或查询用户的信息使用用户名称作为键的请求。ClaimsPrincipal 只 brilliantly 解决了问题。

声明是描述已登录用户的属性的键/值对。属性列表由应用程序,但包括名称和至少的角色。声明,换而言之,是模型标识信息的 ASP.NET Core 方法。是否数据库,云或本地存储区,即使硬编码,可以从任何源中读取声明。声明类是简单,如下:

public class Claim { public string Type { get; } public string Value { get; } // More properties ... }

ASP.NET 核心中的登录过程通过三个类:声明、 ClaimIdentity 和 ClaimsPrincipal。 正在收集的声明列表是一个简单的填充声明对象的数组:

public Claims[] LoadClaims(User user) { var claims = new[] { new Claim(ClaimTypes.Name, user.UserName), new Claim(ClaimTypes.Role, user.Role), new Claim("Picture", user.Picture) }; return claims; }

声明的名称是一个普通的描述性名称,呈现为一个字符串。但是,最常见的声明类型已作为常量分组到 ClaimTypes 类。创建主体,所需调用身份验证工作流完成之前你必须获取标识对象的保留:

var identity = new ClaimsIdentity(claims, "Password");

第一个参数是自助说明性-与正在创建的标识关联的声明列表。第二个参数是指验证的标识所需的身份验证方案的字符串。字符串"Password"是为了提醒您的系统以证明其身份的用户将需要什么。字符串"Password"仅用于提供信息而不语法元素。

上例中的另一个有意义的方面是显式的用户名不是绝对必需的。任何声明,无论声明的类型,可以用于命名用户。下面的代码段显示了一个新的标识对象的另一个等效方法:

var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme, "Nickname", ClaimTypes.Role);

新的标识的身份验证方案作为具有"Cookie",昵称是提供的列表中要用于提供用户的名称的声明的名称。角色,相反,是相同列表确定角色中声明的名称。如果未指定,最后两个参数默认为 ClaimTypes.Name 和 ClaimTypes.Role。最后,从标识创建主体。值得注意的,不过,主体可能具有多个标识。如果这听起来太怪异,则可以将不同区域的同一个应用程序可能需要不同的信息进行身份验证方式大致相同用户 ID 是需要在某些酒店服务台和电子密钥进入简要来标识自己。ClaimsPrincipal 类具有一个标识属性 (集合) 和 Identity 属性。后者是仅对集合中的第一项的引用。

外部身份验证

ASP.NET 核心支持最大的从零开始的标识提供程序通过外部身份验证。大多数情况下,只需安装相应的 NuGet 包的任务。若要依赖在 Twitter 上用户进行身份验证,你将 Microsoft.AspNetCore.Authentication.Twitter 包中,并安装相关的中间件:

app.UseTwitterAuthentication(new TwitterOptions() { AuthenticationScheme = "Twitter", SignInScheme = "Cookies", ConsumerKey = "...", ConsumerSecret = "..." });

SignInScheme 属性是将用于保留的生成的标识的身份验证中间件的标识符。在示例中,将使用的身份验证 cookie。若要查看其效果,首先添加调入 Twitter 的控制器方法:

public async Task TwitterAuth() { var props = new AuthenticationProperties { RedirectUri = "/" }; await HttpContext.Authentication.ChallengeAsync("Twitter", props); }

接下来,一旦 Twitter 已经成功身份验证用户,SignInScheme 属性指示要执行的下一步操作上的应用程序。"Cookie"的值是可接受的如果你想从外部提供程序 (在示例中为 Twitter) 返回的声明 cookie。如果你想要查看并完成的信息通过,说,中间窗体,则必须中断中两个,引入了一种临时登录方案的过程。除了标准 cookie 中间件你具有下列项目:

app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationScheme = "ExternalCookie", AutomaticAuthenticate = false }); app.UseTwitterAuthentication(new TwitterOptions { AuthenticationScheme = "Twitter", SignInScheme = "ExternalCookie" });

当外部提供程序返回时,会使用 ExternalCookie 方案创建一个临时的 cookie。具有适当地设置重定向路径,必须有机会检查返回 Twitter 的主体并进一步对其进行编辑:

var props = new AuthenticationProperties RedirectUri = "/account/external" };

完成该工作流还需要 cookie 方案中登录和注销临时方案 (ExternalCookie):

public async Task External() var principal = await HttpContext .Authentication .AuthenticateAsync("ExternalCookie"); // Edit the principal ... await HttpContext.Authentication.SignInAsync("Cookies", principal); await HttpContext.Authentication.SignOutAsync("ExternalCookie "); }

ExternalCookie,以及 cookie,是只需内部标识符和,只要它们保持一致整个应用程序可以重命名。

总结

在许多情况似乎是完全不同的 ASP.NET 核心,但在大多数的概念,你可能知道从 ASP.NET 仍端不变。你仍需要创建,身份验证 cookie,你仍可以控制到 cookie 和到期日期的名称。支持外部身份验证和登录页具有与之前相同的结构。但是,配置和身份验证基础结构的基础工作发生变化,同时保留其以前的灵活性。

这篇文章中所述的所有内容是指 ASP.NET Core 1.x。有几件事 ASP.NET 核心 2.0 中将工作方式。具体而言,身份验证中间件现在作为服务公开,并且必须在配置服务配置:

services.AddCookieAuthentication(options => { Options.LoginPath = new PathString("/Account/Login"), options.AutomaticAuthenticate = true, options.AutomaticChallenge = true, options.AuthenticationScheme = "Cookies", ... });

在 ASP.NET 核心 2.0 应用程序的启动类的配置方法中,你只需声明你打算使用身份验证服务,无需任何进一步选项:

app.UseAuthentication();

另请注意,在你的代码中用于创建身份验证 cookie SignInAsync 方法名称还公开从 HttpContext 对象直接,而不是传递通过中间的身份验证属性,如 ASP.NET 核心的最后一个代码段中所示1.x。

Dino Esposito 是《Microsoft .NET:构建面向企业的应用程序》(Microsoft Press,2014 年)和《使用 ASP.NET 构建新型 Web 应用程序》(Microsoft Press,2016 年)的作者。作为 JetBrains 的 .NET 和 Android 平台的技术推广人员,Esposito 经常在全球行业活动中发表演讲,并在 [email protected] 上以及 Twitter @despos 上的推文中分享他对于软件的愿景。

衷心感谢以下 Microsoft 技术专家对本文的审阅:Chris Ross

在 MSDN 杂志论坛讨论这篇文章



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有