MSDNの記事は、公式文書、あるリンクをここに。実際には、中国が中にある文書、それはまだ記録をしたいました。
記事のasp.netコア2.xと1.xのバージョンを持って、私は1.xのを無視するためにここにいます
いくつかの余分なものを持つ開始の下には理解するのに役立ちます。
認証認可の和
認証と承認ここでは二つの単語の違いについて話します。
認証:認証。
認証:認証。
簡単に言えば、認証は個人の身元を証明するために使用され、例えば、彼はその後、我々は、このような証明書を必要とする、学生、教師、上司です。認証は、ユーザーが削除管理者のようなものがデータを変更することができます行うことができますことを示すために使用され、通常のユーザは、データのみを表示することができます。
発行者和の対象読者
発行者:発行者、クッキーのためにここで配布されています。
対象読者:観客、クッキーの観客。
テキスト
あなたに早く認定関連のトピックを見て、Asp.netコアアイデンティティは 完全なユーザログイン認証ソリューションを作成し、維持するためのユーザです。しかし、時には、あなたはあなたのクッキーベースの認証をお勧めします。あなたは、独立した認証サービスはのAsp.netコア・アイデンティティを使用せずにクッキーを使用して達成することができます。
例のソースコードをここに。
私たちは、デモプログラムを行うためにここにいるので、そのシステムに仮想的なユーザー・マリア・ロドリゲスの死を記述します。Eメールのユーザー名は「[email protected]」、任意のパスワードに関連付けられています。ユーザーによるPages/Account/Login.cshtml.cs
ファイルは、AuthenticateUser
認証方法を行います。データベースは、実際の環境に基づいている必要があります。
2.0にASP.netコア1.1を参照する方法の詳細についてはこちらを。
私はASP.netコアアイデンティティを使用する場合は、参照ここ。
コンフィギュレーション
プログラムが使用していない場合はMicrosoft.AspNetCore.Appの元のパッケージをプログラムに、引用Microsoft.AspNetCore.Authentication.Cookies(バージョン≥2.1.0を)。
でConfigureServices
によるAuthentication
と、AddCookie
認証サービスについて添加する方法。
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
渡しプログラムの値は、デフォルトの認証方式を使用するように設定されています。AddAuthentication
AuthenticationScheme
AuthenticationScheme
あなたが特定の認証方式を使用するか、複数のインスタンスやクッキー認証システムを持っているときに非常に便利です。提供されるCookieAuthenticationDefaults.AuthenticationScheme
プログラムとして表現「クッキー」に。あなたは、さまざまなシナリオを区別するために文字列値のいずれかのタイプを設定することができます。
Configure
方法、UseAuthentication
認証中間の設定を要求するHttpContext.User
特性。それはすべきUseMvcWithDefaultRoute
とUseMvc
メソッドの前に呼び出されるUseAuthentication
メソッド。
AddCookie設定オプション
だから、大体の設定:
services
.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.ClaimsIssuer = "test";
options.ClaimsIssuer = "aa";
//以及其他... });
経由しての具体的な詳細は、CookieAuthenticationOptions
関連するオプションを設定します。このようAccessDeniedPath、LOGINPATH、LogoutPath、ドメイン、名前、など、いくつかのキーの設定、に焦点を合わせ表情ExpireTimeSpan
。
オプション | 説明 |
---|---|
AccessDeniedPath | ときにHttpContext.ForbidAsync ジャンプアドレス時にトリガー302、デフォルト/Account/AccessDenied |
ClaimsIssuer | 発行者の属性は、クッキーを設定するために使用されます。 |
Cookie.Domain | 有効なドメインクッキー。デフォルトでは、サーバー名のリクエストです。ブラウザがサーバー準拠にクッキーを送信します。あなたは彼の範囲を調整するために、この値を設定することをお勧めします。たとえば、提供.contoso.com を含め、彼のスコープcontoso.com 、www.contoso.com 、staging.www.contoso.com 等が挙げられます。 |
Cookie.Expiration | 取得またはクッキーの有効期限を設定します。コア2.1+推奨されません。勧告は、使用することですExpireTimeSpan クッキーの有効期限を設定します。 |
Cookie.HttpOnly | trueの場合、クッキーはサーバのみがアクセスすることができ、デフォルトを設定するかどうかを、クライアントに偽のjsスクリプトアクセスに設定することができますが、それは、XSS(クロスサイトスクリプティング攻撃を)引き起こす可能性があります。 |
Cookie.Name | クッキーの名前。 |
Cookie.Path | 以下の異なるサイトでサーバーを分離するために使用します。たとえば、サイトが稼働している/app1 以下、この属性が設定され/app1 、その後、クッキーAPP1でのみ有効となります。 |
.Saクイナモドキ科のコロンビアのマイル | これは、ブラウザがクッキーが同じサイトに接続されていることができるかどうかを示します。いくつかの列挙がありますSameSiteMode.Strict だけで同じサイトを許可します。SameSiteMode.Lax HTTPは、異なるサイト、または同じ部位に装着安全な方法を可能にします。OAuth認証をサポートするには、設定する必要がありますSameSiteMode.Lax 。 |
Cookie.SecurePolicy | HTTPSのみを許可するように設定されています。 |
データ保護プロバイダ | 作成された設定のTicketDataFormat (最終的な形で) |
イベント | いくつかの時間のためのハンドラを設定します。例えばOnSignedIn 、OnSigningOut というように、デフォルトでは何も実行されません。 |
EventsType | タイプのイベント。 |
ExpireTimeSpan | 設定は、認証チケットの内部クッキーの有効期限に保存されます。サーバーは、チケットの有効期限が暗号化されてチェックされます。セットにIsPersistent も後に内部のSet-Cookieヘッダに戻すことができます。デフォルトの有効期限は14日です。 |
LOGINPATH | HttpContext.ChallengeAsync この方法302は、ジャンプの時にアドレスを引き起こしています。仮定し/account/login 、このような現在のアクセスなど、/secure リターン401は、アドレスがジャンプする/account/login?returnUrl=/secure ログインページが新しいログイン資格情報を作成する際に、ブラウザが安全なページにジャンプします。デフォルト値は/Account/login |
LogoutPath | ログアウトアドレス。 |
ReturnUrlParameter | ログインまたはログアウトページがジャンプ、過去に渡されたパラメータとして、このジャンプアドレスを作ることができたら、それはパラメータの名前を設定するために使用されます。 |
セッションストア | 身元情報クロスサイトリクエストを保存するために使用します。唯一のセッション識別子を設定した後、クライアントに送信されます。あなたが使用できる場合はそれ以上の同一性。 |
SlidingExpiration | 有効期限をスライディング。新しいクッキーは、新しい有効期限を動的に配布することができるかどうかを識別する。それは可能なSignInAsync メソッドの内部で使用しますAuthenticationProperties 。追加されたセキュリティアプリケーションのための絶対的なクッキーの有効期限を使用します。例えば:await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), new AuthenticationProperties { IsPersistent = true, ExpiresUtc = DateTime.UtcNow.AddMinutes(20) }); |
TicketDataFormat | |
検証 | 現在のオプションが有効であるかどうかを確認してください。 |
クッキーポリシーミドルウェア
クッキーポリシーミドルウェア。アプリケーションの互換性のCookieの設定。そして順番については、プログラムが設定のみ彼の後ろのパイプラインに影響を与えます。次の方法を使用してください。
app.UseCookiePolicy(cookiePolicyOptions);
CookiePolicyOptions提供了程序全局特性相关的设置。并且可以在 cookie 添加或者删除的时候挂钩一些处理程序。 有以下一些属性。
属性 | 描述 |
---|---|
HttpOnly | 设置 cookie 是否是只能通过服务器访问的。默认是HttpOnlyPolicy.None |
CheckConsentNeeded | 一个返回 bool 的函数,如果返回 true 会在弹出一个页面让用户确认使用 cookie |
ConsentCookie | (这个文档上也没说。。。) |
MinimumSameSitePolicy | 同站点策略,默认是SameSiteMode.Lax , Asp.net Core2.0+ 可用。 |
OnAppendCookie | cookie 被追加的时候调用。 |
OnDeleteCookie | cookie 被删除的时候调用。 |
Secure | 标识 cookie 是否必须是https. |
创建一个认证 cookie
创建一个包含用户信息的 cookie需要构造一个ClaimsPrincipal。用户信息会被序列化然后保存在cookie 里面。
用必要的 Claim来构造一个ClaimsIdentity,然后调用 SignInAsync
方法。
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, user.Email),
new Claim("FullName", user.FullName), new Claim(ClaimTypes.Role, "Administrator"), }; var claimsIdentity = new ClaimsIdentity( claims, CookieAuthenticationDefaults.AuthenticationScheme); var authProperties = new AuthenticationProperties { //AllowRefresh = <bool>, // Refreshing the authentication session should be allowed. //ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10), //cookie 的绝对过期时间,会覆盖ExpireTimeSpan的设置。 //IsPersistent = true, //表示 cookie 是否是持久化的以便它在不同的 request 之间传送。设置了ExpireTimeSpan或ExpiresUtc是必须的。 //IssuedUtc = <DateTimeOffset>, // 凭证认证的时间。 //RedirectUri = <string> //http 跳转的时候的路径。 }; await HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties);
SignInAsync
方法创建一个加密过的 cookie 然后把他添加到当前的 response 中。没有设置AuthenticationScheme的话会使用默认的 scheme。
加密是基于asp.net core 的Data Protection系统实现的,所以,如果程序是部署在多台机器或者做了负载均衡上的话,需要配置 data protection(和当年 asp.net 里面的类似。)
登出
SignOutAsync
用来登出当前用户并且删除 cookie。代码如下。
await HttpContext.SignOutAsync(
CookieAuthenticationDefaults.AuthenticationScheme);
登录和登出需要使用相同的方案名称。也就是一样的AuthenticationScheme。
对后台的改变作出反应
当 cookie 被创建之后,它就成了身份标识的唯一来源。即使在后台禁用了当前用户,因为 已经分发的cookie 无法知晓,所以用户依旧可以保持登录状态直到 cookie 失效。
ValidatePrincipal事件可以用来拦截或者覆盖 cookie 的身份验证。这可以减少被收回权限的用户对系统损害的风险。可以通过如下方式实现这个功能。
首先修改一下 SignInAsync 方法里面获取到的用户相关的 claim。
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, user.Email),
new Claim("LastChanged", {数据库的值})//增加一个LastChanged,然后记录一下值 }; var claimsIdentity = new ClaimsIdentity( claims, CookieAuthenticationDefaults.AuthenticationScheme); await HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity));
然后创建一个CustomCookieAuthenticationEvents
继承自CookieAuthenticationEvents
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
public class CustomCookieAuthenticationEvents : CookieAuthenticationEvents { private readonly IUserRepository _userRepository; public CustomCookieAuthenticationEvents(IUserRepository userRepository) { // 从DI 里面获取用户相关的. _userRepository = userRepository; } public override async Task ValidatePrincipal(CookieValidatePrincipalContext context) { var userPrincipal = context.Principal; // 查找上面的LastChanged相关的claim. var lastChanged = (from c in userPrincipal.Claims where c.Type == "LastChanged" select c.Value).FirstOrDefault(); if (string.IsNullOrEmpty(lastChanged) || !_userRepository.ValidateLastChanged(lastChanged))//调用的ValidateLastChanged来判断这个lastChanged 相关的额 cookie是否是一个有效的cookie { context.RejectPrincipal();//拒绝这个 cookie await context.HttpContext.SignOutAsync( CookieAuthenticationDefaults.AuthenticationScheme);// 自动登出 } } //其他的方法,都可以设置 public override Task SignedIn(CookieSignedInContext context) { return base.SignedIn(context); } }
然后通过EventsType
来调用这个设置,然后注入这个CustomCookieAuthenticationEvents
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.EventsType = typeof(CustomCookieAuthenticationEvents);
});
services.AddScoped<CustomCookieAuthenticationEvents>();
考虑一种情况,如果说这个用户更新了之后不影响系统的安全,可以考虑替换context.RejectPrincipal()
为context.ReplacePrincipal
,并且设置context.ShouldRenew=true
来无损的更新用户的principal。
上面的实现方法会在每个请求的时候都触发,所以会对系统的性能造成一定的影响。
持久化 cookie
你可能想要持久化 cookie 让他可以在浏览器的不同进程之间使用。cookie 的持久化应该用类似在界面上显示“记住我”的复选框,然后让用户点击的方式来实现。其他类似的机制也行。
下面的代码用来实现 cookie 持久化。
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
new AuthenticationProperties
{
IsPersistent = true
});
如果 cookie 在浏览器关闭期间过期了,浏览器会在下次启动的时候自动删除 cookie。
AuthenticationProperties在 Microsoft.AspNetCore.Authentication
命名空间里面。
绝对过期时间
可以用ExpiresUtc
来设置绝对过期时间,但必须同时设置IsPersistent
,否者这个这个参数会被忽略,同时,这个 cookie 只是当前回话有效。
当在 SignInAsync 方法里面设置了ExpiresUtc
,它会覆盖CookieAuthenticationOptions
设置了的ExpireTimeSpan
。
下面的代码设置了一个20min 有效期的持久化 cookie,其他有效期相关的设置都会被忽略。
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
new AuthenticationProperties
{
IsPersistent = true,
ExpiresUtc = DateTime.UtcNow.AddMinutes(20) });