using Microsoft.AspNetCore.DataProtection;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\PATH TO COMMON KEY RING FOLDER"))
.SetApplicationName("SharedCookieApp");
builder.Services.ConfigureApplicationCookie(options => {
options.Cookie.Name = ".AspNet.SharedCookie";
});
var app = builder.Build();
在沒有 ASP.NET Core Identity 的情況下直接使用 Cookie 時,請設定資料保護和驗證。 在下列範例中,驗證類型設定為 Identity.Application:
using Microsoft.AspNetCore.DataProtection;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\PATH TO COMMON KEY RING FOLDER"))
.SetApplicationName("SharedCookieApp");
builder.Services.AddAuthentication("Identity.Application")
.AddCookie("Identity.Application", options =>
{
options.Cookie.Name = ".AspNet.SharedCookie";
});
var app = builder.Build();
using Microsoft.AspNetCore.DataProtection;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\PATH TO COMMON KEY RING FOLDER"))
.SetApplicationName("SharedCookieApp");
builder.Services.ConfigureApplicationCookie(options => {
options.Cookie.Name = ".AspNet.SharedCookie";
options.Cookie.Path = "/";
});
var app = builder.Build();
針對生產部署,請將 DataProtectionProvider 設定為使用 DPAPI 或 X509Certificate 加密待用密鑰。 如需詳細資訊,請參閱使用 ASP.NET Core在 Windows 和 Azure 中 待用密鑰加密。 在下列範例中,會將憑證指紋提供給 ProtectKeysWithCertificate:
using Microsoft.AspNetCore.DataProtection;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddDataProtection()
.ProtectKeysWithCertificate("{CERTIFICATE THUMBPRINT}");
ASP.NET 4.x 應用程式有使用到 Microsoft.Owin Cookie 驗證中介軟體,就可以設定爲生成與 ASP.NET Core Cookie 驗證中介軟體相容的驗證 Cookie。 如果 Web 應用程式同時包含 ASP.NET 4.x 應用程式和 ASP.NET Core 應用程式 (必須共用單一登入體驗),這非常有用。 這類案例的特定範例是以累加方式將 Web 應用程式從 ASP.NET 移轉至 ASP.NET Core。 在這種情況下,應用程式的某些部分通常會由原始 ASP.NET 應用程式提供服務,而其他部分則由新的 ASP.NET Core 應用程式提供服務。 不過,使用者應該只需要登入一次。 這可透過下列其中一種方法來完成:
使用 System.Web 配接器的遠端驗證功能,此功能使用 ASP.NET 應用程式來登入使用者。
將 ASP.NET 應用程式設定為使用 Microsoft.Owin Cookie 驗證中介軟體,這樣一來就能與 ASP.NET Core 應用程式共用驗證 Cookie。
若想設定 ASP.NET Microsoft.Owin Cookie 驗證中介軟體,以便與 ASP.NET Core 應用程式共用 Cookie,請遵循上述指示,將 ASP.NET Core 應用程式設定為使用特定 cookie 名稱、應用程式名稱,再將資料保護金鑰留存至已知位置。 如需保存資料保護金鑰的詳細資訊,請參閱設定 ASP.NET 核心資料保護。
更新 Startup.Auth.cs 中的 UseCookieAuthentication 呼叫,設定 AspNetTicketDataFormat 以符合 ASP.NET Core 應用程式的設定:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
},
// Settings to configure shared cookie with ASP.NET Core app
CookieName = ".AspNet.ApplicationCookie",
AuthenticationType = "Identity.Application",
TicketDataFormat = new AspNetTicketDataFormat(
new DataProtectorShim(
DataProtectionProvider.Create(new DirectoryInfo(@"c:\PATH TO COMMON KEY RING FOLDER"),
builder => builder.SetApplicationName("SharedCookieApp"))
.CreateProtector(
"Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware",
// Must match the Scheme name used in the ASP.NET Core app, i.e. IdentityConstants.ApplicationScheme
"Identity.Application",
"v2"))),
CookieManager = new ChunkingCookieManager()
});
此處設定的重要項目包括:
cookie 名稱會設定為與 ASP.NET Core 應用程式中相同的名稱。
資料保護提供者會使用相同的金鑰通道路徑來建立。 請注意,在這些範例中,資料保護金鑰會儲存在磁片上,但可以使用其他資料保護提供者。 例如,只要應用程式之間的組態相符,Redis 或 Azure Blob 儲存體就可以用於資料保護提供者。 如需保存資料保護金鑰的詳細資訊,請參閱設定 ASP.NET 核心資料保護。
應用程式名稱設定為與 ASP.NET Core 應用程式中所使用的應用程式名稱相同。
驗證類型會設定為 ASP.NET Core 應用程式中的驗證配置名稱。
System.Web.Helpers.AntiForgeryConfig.UniqueClaimTypeIdentifier 會被設定為來自 ASP.NET Core 身分識別的宣告,此宣告對於每個使用者都是唯一的。
由於驗證類型已變更為符合 ASP.NET Core 應用程式的驗證配置,因此也必須更新 ASP.NET 應用程式產生新身分識別以使用該相同名稱的方式。 這通常是在 Models/IdentityModels.cs 中完成:
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, "Identity.Application");
// Add custom user claims here
return userIdentity;
}
}
透過這些變更,ASP.NET 和 ASP.NET Core 應用程式可以使用相同驗證,這樣使用者在登入或登出某個應用程式時,動作就會反映在其他應用程式中。
請注意,由於 ASP.NET Identity 與 ASP.NET Core Identity 的資料庫架構之間有差異,因此建議使用者只使用其中一個應用程式來登入,或者使用 ASP.NET 應用程式,或者使用 ASP.NET Core 應用程式。 一旦使用者登入,本節所述的步驟將允許將驗證 cookie 由任一應用程式使用,而且這兩個應用程式都應該能夠登出使用者。
services.AddDataProtection()
.PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
.SetApplicationName("SharedCookieApp");
services.ConfigureApplicationCookie(options => {
options.Cookie.Name = ".AspNet.SharedCookie";
});