C# 用于本地或脱机开发人员的.Net Core共享Cookie

C# 用于本地或脱机开发人员的.Net Core共享Cookie,c#,authentication,cookies,.net-core,C#,Authentication,Cookies,.net Core,我正在对一组.Net核心应用程序使用共享cookie进行评估。将有一个中央应用程序配置为对我们的企业Okta执行SAML身份验证,并设置适当的cookie。一旦通过身份验证,用户将使用目录页面链接到他们想要的任何客户端应用程序。客户端应用程序可以读取cookie,但不能自己执行SAML身份验证循环 中央和客户端应用程序都有如下所示的启动方法 public void配置服务(IServiceCollection服务) { ... services.AddDataProtection() .SetA

我正在对一组.Net核心应用程序使用共享cookie进行评估。将有一个中央应用程序配置为对我们的企业Okta执行SAML身份验证,并设置适当的cookie。一旦通过身份验证,用户将使用目录页面链接到他们想要的任何客户端应用程序。客户端应用程序可以读取cookie,但不能自己执行SAML身份验证循环

中央和客户端应用程序都有如下所示的启动方法

public void配置服务(IServiceCollection服务)
{
...
services.AddDataProtection()
.SetApplicationName(“SharedCookieApps”);
服务
.AddAuthentication(“Identity.Application”)
.AddCookie(“Identity.Application”,选项=>
{
options.Cookie.Name=“.AspNet.SharedCookie”;
});
...
}
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
...
app.UseAuthentication();
app.UseAuthorization();
...
}
当我们在客户端应用程序上进行开发时,我们是否总是需要在同一台机器上运行“中心”应用程序以提供身份验证?或者,当我们在进行本地开发时,我们能做些什么来提供某种假饼干吗?如果开发人员可以通过一些本地配置来改变他们的角色,这将特别有助于他们

顺便说一句,如果出于某种原因共享这样的cookies是个坏主意,我很想知道原因


如果有必要,客户端应用程序将混合使用.Net Core 2和3、Angular和Blazor。

使用ASP.Net Core标识时,应用程序之间必须共享数据保护密钥和应用程序名称。 在下面的示例中,为PersistKeyFilesystem方法提供了一个公共密钥存储位置。这可能会有所帮助

Startup.ConfigureServices文件中的修改:

services.AddDataProtection()
.PersistKeyStoreFileSystem(“{公用密钥环文件夹的路径}”)
.SetApplicationName(“SharedCookieApp”);
services.configureApplicationOK(选项=>{
options.Cookie.Name=“.AspNet.SharedCookie”;

});在做了一些额外的工作之后,我提出了一个允许本地/离线开发的选项。它不需要访问我们的SSO,并且允许开发人员模拟他们想要进行测试的任何声明

在dev中运行时,我将
launchSettings.json
配置为使用windowsAuthentication并禁止匿名身份验证

然后,在dev中,我们使用
iclaimsgransformation
实现来设置声明

public void配置服务(IServiceCollection服务)
{
...
if(Environment.IsDevelopment())
{
服务.AddAuthentication(IISDefaults.AuthenticationScheme);
services.addScope();
}
services.AddDataProtection()
.SetApplicationName(“SharedCookieApps”);
服务
.AddAuthentication(“Identity.Application”)
.AddCookie(“Identity.Application”,选项=>
{
options.Cookie.Name=“.AspNet.SharedCookie”;
});
}
然后,claims transformer只是从一个json文件中读取数据,该文件按类型定义声明

公共类DevClaimsTransformer:iclaims转换
{
专用静态词典;
公共异步任务TransformAsync(ClaimsPrincipal主体)
{
if(devRoleClaims==null)
{
德夫罗莱姆斯=
JsonSerializer.反序列化(
ReadAllText(“dev claims.json”);
}
var identity=(ClaimsIdentity)(主体?.identity??抛出新的ArgumentNullException(主体的名称));
如果(身份验证)
{
foreach(Devrolleclams中的var rc)
{
foreach(rc.值中的变量c)
{
如果(c.Active)
{
identity.AddClaim(新索赔(rc.Key,c.Claim));
}
}
}
}
返回新的ClaimsPrincipal(标识);
}
私有类DevClaim
{
公共字符串声明{get;set;}
公共bool活动{get;set;}
}
}