我正在尝试使用OpenID Connect构建一个SSO(.net核心)服务,它将是Webforms应用程序和服务提供者之间的一个层。我创建了一些端点来检查用户是否经过身份验证并从服务中获取用户声明。当我从浏览器调用这些端点时,我能够得到正确的结果。但是当我从网站上调用它们时(使用HttpWebRequest)。 User.Identity
始终为空。我的端点检查用户是否经过身份验证,如下所示:
[HttpGet]
[Route("IsAuthenticated")]
public IActionResult IsAuthenticated()
{
return Json(User.Identity.IsAuthenticated);
}
或获取访问令牌:
[HttpGet]
[Route("access_token")]
public async Task<IActionResult> AccessToken()
{
var tokenResult = await HttpContext.GetTokenAsync("access_token");
return Json(tokenResult);
}
My Startup ConfigureServices如下所示:
var OIDCConfiguration = new OIDCSettings()
{
Authority = Configuration["OIDCSettings:Authority"],
ClientId = Configuration["OIDCSettings:ClientId"],
ClientSecret = Configuration["OIDCSettings:ClientSecret"],
CallbackPath = Configuration["OIDCSettings:CallbackPath"],
UserInfoEndpoint = Configuration["OIDCSettings:UserInfoEndpoint"]
};
services.AddAuthentication(options => {
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = "oidc";
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOpenIdConnect("oidc", options => {
options.Authority = OIDCConfiguration.Authority;
options.ClientId = OIDCConfiguration.ClientId;
options.ClientSecret = OIDCConfiguration.ClientSecret;
options.CallbackPath = new PathString(OIDCConfiguration.CallbackPath);
options.ResponseType = OpenIdConnectResponseType.Code;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("openid emailAddress");
options.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet;
options.SaveTokens = true;
});
启动中间件我正在使用ChallengeResult对象。
我是OpenID Connect和中间件架构的初学者,所以我不确定我缺少什么,或者即使我的架构是正确的。
答案 0 :(得分:0)
因此,通常当您通过浏览器登录时,ASP.NET Core会管理包含有关ClaimsPrincipal的所有相关信息的cookie,以便服务器可以在对网站的后续请求中识别出您。可能发生的情况是您的服务器未使用身份验证后管理的cookie发送请求,因此为什么无法对您的请求进行身份验证。