Asp.net core 如何使用OpenIdConnect身份验证登录ASP.NET核心身份用户?

Asp.net core 如何使用OpenIdConnect身份验证登录ASP.NET核心身份用户?,asp.net-core,azure-active-directory,asp.net-identity,openid-connect,Asp.net Core,Azure Active Directory,Asp.net Identity,Openid Connect,我正在使用ASP.NET身份验证我的用户,我也希望能够通过Azure广告来实现这一点。如果AzureAD登录成功的话,所有用户都会事先进入数据库,所以我需要做的就是让他们登录并设置他们的cookie。问题是,当我实现新的外部身份验证并验证它们是否存在于我的数据库中时,它们没有登录。 因此,在成功远程登录后,如果在我的控制器中检查User.Identity.IsAuthenticated它将返回true,但\u signingmanager.IsSignedIn(User),它将返回false。我

我正在使用ASP.NET身份验证我的用户,我也希望能够通过Azure广告来实现这一点。如果AzureAD登录成功的话,所有用户都会事先进入数据库,所以我需要做的就是让他们登录并设置他们的cookie。问题是,当我实现新的外部身份验证并验证它们是否存在于我的数据库中时,它们没有登录。 因此,在成功远程登录后,如果在我的控制器中检查
User.Identity.IsAuthenticated
它将返回
true
,但
\u signingmanager.IsSignedIn(User)
,它将返回
false
。我试图遵循MS指南和文档,但我认为我的配置有问题

以下是启动:

services.AddMvc(options=>options.EnableEndpointRouting=false)
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddRouting(选项=>
{
options.LowercaseQueryStrings=true;
options.LowercaseUrls=true;
});
配置(选项=>
{
options.MinimumSameSitePolicy=SameSiteMode.None;
});
services.AddDbContext(选项=>
options.UseSqlServer(Configuration.GetConnectionString(“”));
services.AddDefaultIdentity()
.AddRoles()
.AddRoleManager()
.AddEntityFrameworkStores()
.AddUserManager();
services.AddAuthentication(选项=>
{
options.DefaultAuthenticateScheme=CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme=OpenIdConnectDefaults.AuthenticationScheme;
options.defaultsignnscheme=CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(选项=>
{
Configuration.GetSection(“OpenIdConnect”).Bind(选项);
options.TokenValidationParameters.ValidateIssuer=false;
options.Events=新的OpenIdConnectEvents
{
OnAuthorizationCodeReceived=异步ctx=>
{
var request=ctx.HttpContext.request;
var currentUri=UriHelper.BuildAbsolute(request.Scheme、request.Host、request.PathBase、request.Path);
var-credential=new-ClientCredential(ctx.Options.ClientId,ctx.Options.ClientSecret);
var distributedCache=ctx.HttpContext.RequestServices.GetRequiredService();
字符串userId=ctx.Principal.FindFirst(“http://schemas.microsoft.com/identity/claims/objectidentifier1.价值;
var authContext=新的AuthenticationContext(ctx.Options.Authority);
var result=await authContext.AcquireTokenByAuthorizationCodeAsync(
ctx.ProtocolMessage.Code,新Uri(currentUri),凭证,ctx.Options.Resource);
ctx.HandleCodeRedemption(result.AccessToken、result.IdToken);
}
};
});
var builder=services.AddIdentityCore(选项=>
{
options.Password.RequireDigit=true;
options.Password.RequiredLength=6;
options.Password.RequireLowercase=false;
options.Password.RequireUppercase=false;
options.Password.RequireNonAlphanumeric=false;
options.Lockout.DefaultLockoutTimeSpan=TimeSpan.FromMinutes(10);
options.locket.MaxFailedAccessAttempts=5;
options.locket.AllowedForNewUsers=true;
options.User.RequireUniqueEmail=true;
})
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
services.AddLogging(选项=>
{
options.AddConfiguration(Configuration.GetSection(“日志”))
.AddConsole();
});
}
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
IdentityModelEventSource.ShowPII=true;
}
其他的
{
app.UseExceptionHandler(“/Home/Error”);
app.UseHsts();
}
var builder=new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile(“appsettings.json”,可选:false,reloadOnChange:true)
.AddJsonFile($“appsettings.{env.EnvironmentName}.json”,可选:true,重载更改:true)
.AddenEnvironmentVariables();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc(路由=>
{
routes.MapRoute(
名称:“默认”,
模板:“{controller=Home}/{action=Index}/{id?}”);
});
在我的控制器中:

[AllowAnonymous]
public IActionResult AzureLogin()
{
    if (User.Identity.IsAuthenticated)
    {
        return RedirectToAction(nameof(HandleLogin)):
    }

     return Challenge(new AuthenticationProperties
     {
         RedirectUri = Url.Action(nameof(HandleLogin))
     });
}

[Authorize]
public async Task<IActionResult> HandleLogin()
{

    var isAuth = User.Identity.IsAuthenticated; // true
    var isSigned = _signInmanager.IsSignedIn(User); // false

    return ....
}
[AllowAnonymous]
public IActionResult AzureLogin()
{
if(User.Identity.IsAuthenticated)
{
返回重定向到操作(名称(HandleLogin)):
}
返回质询(新的AuthenticationProperties)
{
RedirectUri=Url.Action(nameof(HandleLogin))
});
}
[授权]
公共异步任务HandleLogin()
{
var isAuth=User.Identity.IsAuthenticated;//true
var isSigned=\u signInmanager.IsSignedIn(用户);//false
返回。。。。
}

您可以尝试将
自动验证
cookie设置为

services.Configure<IdentityOptions>(options => { 
    // other configs
    options.Cookies.ApplicationCookie.AutomaticAuthenticate = true;
});
services.Configure(选项=>{
//其他配置
options.Cookies.applicationcokie.AutomaticAuthenticate=true;
});

以下是我如何做到这一点的: 由于我是通过ASP.NET Identity授权用户,因此我将身份验证选项中的默认身份验证方法更改为
options.DefaultAuthenticateScheme=IdentityConstants.ApplicationScheme;
,并在
OpenIdConnectOptions
OnAuthorizationCodeReceived
事件中验证并登录身份使用通过
SignInManager.SignInAsync()方法