gpt4 book ai didi

c# - 为什么使用 Identity Server 和 asp.net core 2 在基于 token 的身份验证上使用 cookie

转载 作者:行者123 更新时间:2023-12-05 00:48:16 24 4
gpt4 key购买 nike

我正在创建一个示例应用程序,以了解身份服务器 4 身份验证如何与 Asp.net core 2 一起工作。我注意到为不同级别生成了一些 cookie,如所附屏幕截图所示。我的问题是为什么会生成这些 cookie?

下面的语句,我取自 Identity Server 文档。身份服务器配置时

IdentityServer 在内部使用自定义方案(通过常量 IdentityServerConstants.DefaultCookieAuthenticationScheme)调用 AddAuthentication 和 AddCookie,

为什么它在身份服务器本身上调用 AddCookies 方法?

另外,当我将 Asp.net 核心 Web 客户端配置为使用身份服务器身份验证时,它也会调用 AddCookie() 方法。当我尝试对其发表评论时,它会给我一个错误。我有点不清楚这里发生了什么。

身份服务器配置

services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddToDoUserStore()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients());

services.AddAuthentication("MyCookie")
.AddCookie("MyCookie", options =>
{
options.ExpireTimeSpan = new System.TimeSpan(0, 0, 15);
});

Web 客户端配置

services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
options.Authority = "https://localhost:44377/";
options.RequireHttpsMetadata = true;
options.ClientId = "ToDoTaskManagmentClient";
options.Scope.Clear();
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("address");
options.Scope.Add("roles");
options.Scope.Add("usertodoapi");
options.Scope.Add("countries");
options.Scope.Add("subscriptionlevel");
options.Scope.Add("offline_access");
options.ResponseType = "code id_token";
options.SaveTokens = true;
options.ClientSecret = "secret";
options.GetClaimsFromUserInfoEndpoint = true;
options.ClaimActions.Clear();
options.ClaimActions.MapJsonKey("given_name", "given_name");
options.ClaimActions.MapJsonKey("family_name", "family_name");
options.ClaimActions.MapJsonKey("role", "role");
options.ClaimActions.MapJsonKey("country", "country");
options.ClaimActions.MapJsonKey("subscriptionlevel", "subscriptionlevel");
options.Events = new OpenIdConnectEvents()
{
OnTokenValidated = e =>
{
var identity = e.Principal;
var subjectClaim = identity.Claims.FirstOrDefault(z => z.Type == "sub");
var expClaims = identity.Claims.FirstOrDefault(z => z.Type == "exp");
var newClaimsIdentity = new ClaimsIdentity(e.Scheme.Name);
newClaimsIdentity.AddClaim(subjectClaim);
newClaimsIdentity.AddClaim(expClaims);

e.Principal = new ClaimsPrincipal(newClaimsIdentity);
return Task.FromResult(0);
},
OnUserInformationReceived = e =>
{
e.User.Remove("address");
return Task.FromResult(0);
}
};
});

enter image description here

最佳答案

您的 Identity Server 应用程序需要一个身份验证 cookie(和 session ID cookie),以便前端 channel 端点(授权、同意、check_session_iframe 和可能的其他端点)知道用户是否经过身份验证以及 session 的当前状态。没有这个,它就不会知道是谁在调用它。如果 IDS4 检测到传入的请求未经过身份验证,它将自动重定向到默认方案的登录 URL - 然后您可以自由地实现您喜欢的任何身份验证流程。

您的客户端应用程序可能需要也可能不需要 cookie,具体取决于架构。传统的服务器端 WebForms 或 MVC 风格的应用程序将需要一个,但使用 oidc-client-js 之类的库的纯 JS 客户端不需要,并且可以纯粹使用从您的身份服务器获得的访问 token 与后端对话。

关于c# - 为什么使用 Identity Server 和 asp.net core 2 在基于 token 的身份验证上使用 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52274319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com