欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.NET?Core中Cookie驗(yàn)證身份用法詳解

 更新時(shí)間:2022年02月22日 09:58:21   作者:Sweet-Tang  
本文詳細(xì)講解了ASP.NET?Core中Cookie驗(yàn)證身份的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

ASP.NET Core 1.x提供了通過Cookie 中間件將用戶主體序列化為一個(gè)加密的Cookie,然后在后續(xù)請求中驗(yàn)證Cookie并重新創(chuàng)建主體,并將其分配給HttpContext.User屬性。如果您要提供自己的登錄界面和用戶數(shù)據(jù)庫,可以使用作為獨(dú)立功能的Cookie中間件。

ASP.NET Core 2.x的一個(gè)主要變化是不再存在Cookie中間件。取而代之的是在Startup.cs文件中的Configure方法中的調(diào)用UseAuthentication方法會(huì)添加設(shè)置HttpContext.User屬性的 AuthenticationMiddleware 中間件。

添加配置

ASP.NET Core 1.x

按下列步驟操作:

  • 在您的項(xiàng)目中安裝Microsoft.AspNetCore.Authentication.CookiesNuGet包。此包包含Cookie中間件。

  • 在Startup.cs文件中的Configure方法中添加下面的行,在app.UseMvc()語句之前:

        app.UseCookieAuthentication(new CookieAuthenticationOptions()
        {
            AccessDeniedPath = "/Account/Forbidden/",
            AuthenticationScheme = "MyCookieAuthenticationScheme",
            AutomaticAuthenticate = true,
            AutomaticChallenge = true,
            LoginPath = "/Account/Unauthorized/"
        });

ASP.NET Core 2.x

按下列步驟操作:

  • 如果不使用Microsoft.AspNetCore.All 元包,則在您的項(xiàng)目中安裝2.0版的Microsoft.AspNetCore.Authentication.CookiesNuGet包。

  • 在Startup.cs文件中的Configure方法中調(diào)用UseAuthentication方法:

        app.UseAuthentication();
  • 在Startup.cs文件中的ConfigureServices方法中調(diào)用AddAuthenticationAddCookie方法:
        services.AddAuthentication("MyCookieAuthenticationScheme")
                .AddCookie("MyCookieAuthenticationScheme", options => {
                    options.AccessDeniedPath = "/Account/Forbidden/";
                    options.LoginPath = "/Account/Unauthorized/";
                });

上面的代碼片段配置了以下部分或全部選項(xiàng):

  • AccessDeniedPath - 當(dāng)用戶嘗試訪問資源但沒有通過任何授權(quán)策略時(shí),這是請求會(huì)重定向的相對路徑資源。
  • AuthenticationScheme - 這是一個(gè)已知的特定Cookie認(rèn)證方案的值。當(dāng)有多個(gè)Cookie驗(yàn)證實(shí)例,并且您想限制對一個(gè)實(shí)例的授權(quán)時(shí),這就非常有用。
  • AutomaticAuthenticate - 此標(biāo)識(shí)僅適用于ASP.NET Core 1.x。它表示Cookie身份驗(yàn)證應(yīng)在每個(gè)請求上運(yùn)行,并嘗試驗(yàn)證和重建序列化主體。
  • AutomaticChallenge - 此標(biāo)識(shí)僅適用于ASP.NET Core 1.x。這表示當(dāng)授權(quán)失敗時(shí),1.x Cookie認(rèn)證應(yīng)將瀏覽器重定向到LoginPathAccessDeniedPath。
  • LoginPath - 當(dāng)用戶嘗試訪問資源但尚未認(rèn)證時(shí),這是請求重定向的相對路徑。

其它選項(xiàng)包括為Cookie認(rèn)證創(chuàng)建的設(shè)置選項(xiàng),身份驗(yàn)證的Cookie的名稱,Cookie的域和Cookie各種安全屬性。默認(rèn)情況下,Cookie身份驗(yàn)證為其創(chuàng)建的任何Cookie使用適當(dāng)?shù)陌踩x項(xiàng),例如:

  • 設(shè)置HttpOnly標(biāo)志以防止客戶端JavaScript中訪問Cookie
  • 如果請求是通過HTTPS訪問,則將Cookie限制為HTTPS

創(chuàng)建身份認(rèn)證Cookie

要?jiǎng)?chuàng)建一個(gè)保存用戶信息的cookie,您必須構(gòu)建一個(gè)ClaimsPrincipal 保存您希望序列化到Cookie中的信息。

ASP.NET Core 1.x

    await HttpContext.Authentication.SignInAsync("MyCookieAuthenticationScheme", principal);

ASP.NET Core 2.x

    await HttpContext.SignInAsync("MyCookieAuthenticationScheme", principal);

這將創(chuàng)建一個(gè)加密的Cookie并將其添加到當(dāng)前響應(yīng)中。在調(diào)用SignInAsync時(shí),必須在配置中指定的AuthenticationScheme

順便提一下,使用的加密方式是ASP.NET Core的Data Protection系統(tǒng)。如果您在多臺(tái)機(jī)器上進(jìn)行托管、負(fù)載平衡或使用Web集群,則需要配置Data Protection才能使用相同的密鑰和應(yīng)用程序標(biāo)識(shí)符。

Signing out(登出)

要退出當(dāng)前用戶并刪除其Cookie,請?jiān)诳刂破髦姓{(diào)用以下方法:

ASP.NET Core 1.x

    await HttpContext.Authentication.SignOutAsync("MyCookieAuthenticationScheme");

ASP.NET Core 2.x

    await HttpContext.SignOutAsync("MyCookieAuthenticationScheme");

服務(wù)端變化反饋

警告: 一旦創(chuàng)建了認(rèn)證的Cookie,它將成為唯一的身份來源。即使您在服務(wù)系統(tǒng)中禁用用戶,Cookie身份驗(yàn)證也無法了解此信息,只要Cookie有效,用戶仍可登錄。

Cookie認(rèn)證在其選項(xiàng)中提供了一系列事件。ValidateAsync()事件可用于攔截和重寫Cookie身份驗(yàn)證。

可以考慮在后端用戶數(shù)據(jù)庫中增加LastChanged列。為了在數(shù)據(jù)庫更改時(shí)使Cookie無效,您應(yīng)該首先在創(chuàng)建Cookie時(shí)添加一個(gè)LastChanged包含當(dāng)前值的聲明。數(shù)據(jù)庫更改時(shí),更新LastChanged例的值。

要重寫ValidateAsync()事件的實(shí)現(xiàn),您必須編寫一個(gè)具有以下簽名的方法:

    Task ValidateAsync(CookieValidatePrincipalContext context);

ASP.NET Core Identity 在SecurityStampValidator實(shí)現(xiàn)了這一邏輯,鏈接地址。示例如下所示:

ASP.NET Core 1.x

    public static class LastChangedValidator
    {
        public static async Task ValidateAsync(CookieValidatePrincipalContext context)
        {
            // Pull database from registered DI services.
            var userRepository = context.HttpContext.RequestServices.GetRequiredService<IUserRepository>();
            var userPrincipal = context.Principal;
    
            // Look for the last changed claim.
            string lastChanged;
            lastChanged = (from c in userPrincipal.Claims
                            where c.Type == "LastUpdated"
                            select c.Value).FirstOrDefault();
    
            if (string.IsNullOrEmpty(lastChanged) ||
                !userRepository.ValidateLastChanged(userPrincipal, lastChanged))
            {
                context.RejectPrincipal();
                await context.HttpContext.Authentication.SignOutAsync("MyCookieAuthenticationScheme");
            }
        }
    }

然后,在Startup.cs文件中的Configure方法中將Cokie認(rèn)證配置進(jìn)行重寫:

    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        Events = new CookieAuthenticationEvents
        {
            OnValidatePrincipal = LastChangedValidator.ValidateAsync
        }
    });

ASP.NET Core 2.x

    public static class LastChangedValidator
    {
        public static async Task ValidateAsync(CookieValidatePrincipalContext context)
        {
            // Pull database from registered DI services.
            var userRepository = context.HttpContext.RequestServices.GetRequiredService<IUserRepository>();
            var userPrincipal = context.Principal;
    
            // Look for the last changed claim.
            string lastChanged;
            lastChanged = (from c in userPrincipal.Claims
                            where c.Type == "LastUpdated"
                            select c.Value).FirstOrDefault();
    
            if (string.IsNullOrEmpty(lastChanged) ||
                !userRepository.ValidateLastChanged(userPrincipal, lastChanged))
            {
                context.RejectPrincipal();
                await context.HttpContext.SignOutAsync("MyCookieAuthenticationScheme");
            }
        }
    }

然后,將在Startup.cs的ConfigureServices方法中將Cookie服務(wù)注冊進(jìn)行配置:

    services.AddAuthentication("MyCookieAuthenticationScheme")
            .AddCookie(options =>
            {
                options.Events = new CookieAuthenticationEvents
                {
                    OnValidatePrincipal = LastChangedValidator.ValidateAsync
                };
            });

如果要非破壞性地更新用戶主體,可以調(diào)用context.ReplacePrincipal(),并將context.ShouldRenew屬性設(shè)置為true

Cookie設(shè)置選項(xiàng)

CookieAuthenticationOptions類提供了各種配置選項(xiàng),在創(chuàng)建時(shí)調(diào)整Cookie的配置。

ASP.NET Core 1.x

  • ClaimsIssuer是由中間件創(chuàng)建的任何聲明時(shí)使用的Issuer屬性。
  • CookieDomain是提供Cookie的域名。默認(rèn)情況下,這是發(fā)送請求的主機(jī)名。瀏覽器僅將Cookie提供給匹配的主機(jī)名。您可能希望對此進(jìn)行調(diào)整,以便您的域中的任何主機(jī)都可以使用Cookie。例如,將Cookie域名設(shè)置為.contoso.com,可以使用Cookie的域名有contoso.com、www.contoso.com、staging.www.contoso.com等。
  • CookieHttpOnly是一個(gè)標(biāo)識(shí),指定Cookie是否只能由服務(wù)器訪問。默認(rèn)為true。如果您的應(yīng)用程序具有Cross-Site Scripting(XSS)的問題,更改此值可能會(huì)導(dǎo)致Cookie被盜用。
  • CookiePath可用于隔離在相同主機(jī)名上運(yùn)行的應(yīng)用程序。如果你有一個(gè)應(yīng)用程序在/app1中運(yùn)行,并希望限制發(fā)送的Cookie只發(fā)送到該應(yīng)用程序,那么您應(yīng)該將CookiePath屬性設(shè)置為/app1。通過這樣做,Cookie只適用于對/app1或其下任何內(nèi)容的請求。
  • CookieSecure是一個(gè)標(biāo)識(shí),表示創(chuàng)建的Cookie是否應(yīng)該被限制為HTTPS,HTTP或HTTPS,或與請求相同的協(xié)議。默認(rèn)為SameAsRequest
  • ExpireTimeSpanTimeSpan類型,在此時(shí)間段之后Cookie將過期。將當(dāng)前日期加上此時(shí)間段為創(chuàng)建Cookie的到期日期。
  • SlidingExpiration是一個(gè)標(biāo)識(shí),指示當(dāng)超過一半的ExpireTimeSpan間隔時(shí),Cookie到期日期是否復(fù)位。新的到期日是當(dāng)前時(shí)間加上ExpireTimespan。調(diào)用SignInAsync時(shí),可以使用AuthenticationProperties類設(shè)置絕對到期時(shí)間。絕對到期時(shí)間可以通過限制認(rèn)證Cookie有效的時(shí)間來提高應(yīng)用程序的安全性。

在Startup.cs文件中的Configure方法中使用CookieAuthenticationOptions的例子如下:

    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        CookieName = "AuthCookie",
        CookieDomain = "contoso.com",
        CookiePath = "/",
        CookieHttpOnly = true,
        CookieSecure = CookieSecurePolicy.Always
    });

ASP.NET Core 2.x

ASP.NET Core 2.x 統(tǒng)一了用于配置Cookie的API。1.x API已被標(biāo)記為過時(shí),并且在CookieAuthenticationOptions類中引入了一種類型為CookieBuilder新的Cookie屬性。建議您遷移到2.x API。

  • ClaimsIssuer是由Cookie認(rèn)證創(chuàng)建的任何聲明時(shí)使用的Issuer屬性。
  • CookieBuilder.Domain是提供Cookie的域名。默認(rèn)情況下,這是發(fā)送請求的主機(jī)名。瀏覽器僅將Cookie提供給匹配的主機(jī)名。您可能希望對此進(jìn)行調(diào)整,以便您的域中的任何主機(jī)都可以使用Cookie。例如,將Cookie域名設(shè)置為.contoso.com,可以使用Cookie的域名有contoso.com、www.contoso.comstaging.www.contoso.com
  • CookieBuilder.HttpOnly是一個(gè)標(biāo)識(shí),指定Cookie是否只能由服務(wù)器訪問。默認(rèn)為true。如果您的應(yīng)用程序具有Cross-Site Scripting(XSS)的問題,更改此值可能會(huì)導(dǎo)致Cookie被盜用。
  • CookieBuilder.Path可用于隔離在相同主機(jī)名上運(yùn)行的應(yīng)用程序。如果你有一個(gè)應(yīng)用程序在/app1中運(yùn)行,并希望限制發(fā)送的Cookie只發(fā)送到該應(yīng)用程序,那么您應(yīng)該將CookiePath屬性設(shè)置為/app1。通過這樣做,Cookie只適用于對/app1或其下任何內(nèi)容的請求。
  • CookieBuilder.SameSite表示瀏覽器是否允許Cookie被附加到同一站點(diǎn)或跨站點(diǎn)的請求。默認(rèn)為SameSiteMode.Lax。
  • CookieBuilder.SecurePolicy是一個(gè)標(biāo)識(shí),表示創(chuàng)建的Cookie是否應(yīng)該被限制為HTTPS,HTTP或HTTPS,或與請求相同的協(xié)議。默認(rèn)為SameAsRequest。
  • ExpireTimeSpanTimeSpan類型,在此時(shí)間段之后Cookie將過期。將當(dāng)前日期加上此時(shí)間段為創(chuàng)建Cookie的到期日期。
  • SlidingExpiration是一個(gè)標(biāo)識(shí),指示當(dāng)超過一半的ExpireTimeSpan間隔時(shí),Cookie到期日期是否復(fù)位。新的到期日是當(dāng)前時(shí)間加上ExpireTimespan。調(diào)用SignInAsync時(shí),可以使用AuthenticationProperties類設(shè)置絕對到期時(shí)間。絕對到期時(shí)間可以通過限制認(rèn)證Cookie有效的時(shí)間來提高應(yīng)用程序的安全性。

在Startup.cs的ConfigureServices方法中使用CookieAuthenticationOptions的例子如下:

    services.AddAuthentication()
        .AddCookie(options =>
        {
            options.Cookie.Name = "AuthCookie";
            options.Cookie.Domain = "contoso.com";
            options.Cookie.Path = "/";
            options.Cookie.HttpOnly = true;
            options.Cookie.SameSite = SameSiteMode.Lax;
            options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
        });

持久Cookie

您可能希望Cookie在瀏覽器會(huì)話中持續(xù)存在,并希望設(shè)置身份和Cookie傳輸?shù)慕^對過期時(shí)間。這種持久性應(yīng)該只能是用戶顯示同意,在登錄時(shí)的“記住我”復(fù)選框或類似的機(jī)制啟用。您可以通過在創(chuàng)建身份認(rèn)證Cookie時(shí)調(diào)用的SignInAsync方法中使用AuthenticationProperties參數(shù)來執(zhí)行這些操作。例如:

ASP.NET Core 1.x

    await HttpContext.Authentication.SignInAsync(
        "MyCookieAuthenticationScheme",
        principal,
        new AuthenticationProperties
        {
            IsPersistent = true
        });

上述代碼片段中使用的AuthenticationProperties類,位于Microsoft.AspNetCore.Http.Authentication命名空間中。

ASP.NET Core 2.x

    await HttpContext.SignInAsync(
        "MyCookieAuthenticationScheme",
        principal,
        new AuthenticationProperties
        {
            IsPersistent = true
        });

上述代碼片段中使用的AuthenticationProperties類,位于Microsoft.AspNetCore.Authentication命名空間中。

上面的代碼段創(chuàng)建一個(gè)身份和相應(yīng)的Cookie,直到瀏覽器關(guān)閉。以前通過Cookie設(shè)置選項(xiàng)配置的任何滑動(dòng)過期設(shè)置仍然有效。如果Cookie在瀏覽器關(guān)閉時(shí)過期,瀏覽器會(huì)在重新啟動(dòng)后清除它。如果Cookie在瀏覽器關(guān)閉時(shí)過期,瀏覽器會(huì)在重新啟動(dòng)后清除它。

絕對到期時(shí)間

ASP.NET Core 1.x

    await HttpContext.Authentication.SignInAsync(
        "MyCookieAuthenticationScheme",
        principal,
        new AuthenticationProperties
        {
            ExpiresUtc = DateTime.UtcNow.AddMinutes(20)
        });

ASP.NET Core 2.x

    await HttpContext.SignInAsync(
        "MyCookieAuthenticationScheme",
        principal,
        new AuthenticationProperties
        {
            ExpiresUtc = DateTime.UtcNow.AddMinutes(20)
        });

上述代碼段創(chuàng)建一個(gè)持續(xù)20分鐘的身份和相應(yīng)的cookie。這將忽略以前通過Cookie設(shè)置選項(xiàng)配置的任何滑動(dòng)過期設(shè)置。

ExpiresUtcIsPersistent屬性是互斥的。

到此這篇關(guān)于ASP.NET Core中Cookie驗(yàn)證身份用法詳解的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Asp.NetCore1.1版本去掉project.json后如何打包生成跨平臺(tái)包

    Asp.NetCore1.1版本去掉project.json后如何打包生成跨平臺(tái)包

    這篇文章主要為大家詳細(xì)介紹了Asp.NetCore1.1版本去掉project.json后如何打包生成跨平臺(tái)包 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • ASP.NET Core奇淫技巧之動(dòng)態(tài)WebApi的實(shí)現(xiàn)

    ASP.NET Core奇淫技巧之動(dòng)態(tài)WebApi的實(shí)現(xiàn)

    這篇文章主要介紹了ASP.NET Core奇淫技巧之動(dòng)態(tài)WebApi的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • SignalR Self Host+MVC等多端消息推送服務(wù)(三)

    SignalR Self Host+MVC等多端消息推送服務(wù)(三)

    這篇文章主要為大家詳細(xì)介紹了SignalR Self Host+MVC等多端消息推送服務(wù)的第三篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • ASP.NET導(dǎo)出word實(shí)例

    ASP.NET導(dǎo)出word實(shí)例

    本文主要介紹了ASP.NET導(dǎo)出word的實(shí)例方法。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • .net cs后臺(tái)刷新aspx頁面的四種方式

    .net cs后臺(tái)刷新aspx頁面的四種方式

    這篇文章主要介紹了.net cs后臺(tái)刷新aspx頁面的四種方式,需要的朋友可以參考下
    2014-03-03
  • 解析WPF綁定層次結(jié)構(gòu)數(shù)據(jù)的應(yīng)用詳解

    解析WPF綁定層次結(jié)構(gòu)數(shù)據(jù)的應(yīng)用詳解

    本文講述WPF中單層次數(shù)據(jù)和多層次數(shù)據(jù)的綁定方法,主要闡述數(shù)據(jù)綁定的顯示層面,其中涉及了ListBox和Treeview控件。并說明它們之間的差異
    2013-05-05
  • ASP.NET Core自動(dòng)生成小寫破折號路由的實(shí)現(xiàn)方法

    ASP.NET Core自動(dòng)生成小寫破折號路由的實(shí)現(xiàn)方法

    這篇文章主要介紹了ASP.NET Core自動(dòng)生成小寫破折號路由的實(shí)現(xiàn)方法,幫助大家更好的理解和學(xué)習(xí)使用ASP.NET Core,感興趣的朋友可以了解下
    2021-04-04
  • 如何在.net6webapi中使用自動(dòng)依賴注入

    如何在.net6webapi中使用自動(dòng)依賴注入

    IOC/DI是一種設(shè)計(jì)模式,用于解耦組件之間的依賴關(guān)系,在傳統(tǒng)的編程模式中,組件之間的依賴關(guān)系是硬編碼在代碼中的,這樣會(huì)導(dǎo)致代碼的耦合度很高,難以維護(hù)和發(fā)展,這篇文章主要介紹了如何在.net6webapi中實(shí)現(xiàn)自動(dòng)依賴注入,需要的朋友可以參考下
    2023-06-06
  • ASP.NET?Core實(shí)時(shí)庫SignalR簡介及使用

    ASP.NET?Core實(shí)時(shí)庫SignalR簡介及使用

    這篇文章介紹了ASP.NET?Core實(shí)時(shí)庫SignalR簡介及使用方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • 通用?HTTP?簽名組件的另類實(shí)現(xiàn)方式

    通用?HTTP?簽名組件的另類實(shí)現(xiàn)方式

    這篇文章主要介紹了通用?HTTP?簽名組件的另類實(shí)現(xiàn)方式,實(shí)現(xiàn)思路大概是采用鏈?zhǔn)秸{(diào)用的方式,使得簽名的步驟可以動(dòng)態(tài)拼湊組合,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09

最新評論