User.Identity.IsAuthenticated возвращает false после входа в систему при использовании OpenId Connect с Auth0 - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь реализовать аутентификацию пользователя в приложении ASP. Net Core (v2.1) MVC с использованием OpenId Connect и Auth0. У меня есть необходимые конфигурации, хранящиеся в файлах AppSettings, и приложение работает хорошо, пока не появится страница входа в Auth0. После входа в систему он обращается к URL обратного вызова, который в основном вызывает метод (имя метода - обратный вызов) в моем контроллере учетной записи. В методе обратного вызова я пытаюсь получить токен доступа, если пользователь аутентифицирован. Однако User.Identity.IsAuthenticated возвращает значение false. Вот мой код в файле Startup.cs -

public void ConfigureServices(IServiceCollection services)
{
    //Set Cookie Policy
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    // Add authentication services
    services.AddAuthentication(options => {
        options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    })
    .AddCookie()
    .AddOpenIdConnect("Auth0", options => {
        options.Authority = $"https://{Configuration["Auth0:Domain"]}";
        options.ClientId = Configuration["Auth0:ClientId"];
        options.ClientSecret = Configuration["Auth0:ClientSecret"];
        options.ResponseType = "code";
        options.Scope.Clear();
        options.Scope.Add("openid");
        options.CallbackPath = new PathString("/oauth/callback");
        options.ClaimsIssuer = "Auth0";
        options.SaveTokens = true;

        options.Events = new OpenIdConnectEvents
        {
            // handle the logout redirection 
            OnRedirectToIdentityProviderForSignOut = (context) =>
            {
                var logoutUri = $"https://{Configuration["Auth0:Domain"]}/v2/logout?client_id={Configuration["Auth0:ClientId"]}";

                var postLogoutUri = context.Properties.RedirectUri;
                if (!string.IsNullOrEmpty(postLogoutUri))
                {
                    if (postLogoutUri.StartsWith("/"))
                    {
                        // transform to absolute
                        var request = context.Request;
                        postLogoutUri = request.Scheme + "://" + request.Host + request.PathBase + postLogoutUri;
                    }
                    logoutUri += $"&returnTo={ Uri.EscapeDataString(postLogoutUri)}";
                }

                context.Response.Redirect(logoutUri);
                context.HandleResponse();

                return Task.CompletedTask;
            }
        };
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

А вот мой код в контроллере учетной записи

public class AccountController : Controller
{
    public async Task Login(string returnUrl = "/")
    {
        await HttpContext.ChallengeAsync("Auth0", new AuthenticationProperties() { RedirectUri = returnUrl });
    }

    [Authorize]
    public async Task Logout()
    {
        await HttpContext.SignOutAsync("Auth0", new AuthenticationProperties
        {
            RedirectUri = Url.Action("Index", "Home")
        });
        await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    }

    public IActionResult AccessDenied()
    {
        return View();
    }

    [Authorize]
    public IActionResult Claims()
    {
        return View();
    }

    [Route("/oauth/callback")]
    public async Task<ActionResult> CallbackAsync()
    {
        if (User.Identity.IsAuthenticated)
        {
            string accessToken = await HttpContext.GetTokenAsync("access_token");
        }

        return RedirectToAction("Claims", "Account");
    }
}

Пожалуйста, помогите. Любая помощь будет оценена.

Спасибо,

Амит Ананд

1 Ответ

0 голосов
/ 05 февраля 2020

На самом деле я не уверен, почему ваш пользовательский метод CallbackAsync срабатывает при входе OID C. URL обратного вызова промежуточного программного обеспечения OID C будет обрабатывать оценку токена, декодировать токен, обменивать токен и, наконец, соответствовать принципу пользователя. Вы не должны обрабатывать процесс и позволять промежуточному программному обеспечению OID C обрабатывать его, поэтому измените маршрут метода CallbackAsync (или измените CallbackPath в промежуточном программном обеспечении OID C, но, конечно, URL-адрес должен соответствовать URL-адресу config на портале Auth0), например: [Route("/oauth/callbackAfterLogin")].

После изменения этого процесса будет: пользователь будет перенаправлен на Auth0 для входа в систему -> Auth0 подтвердит учетные данные пользователя и перенаправит пользователя обратно на URL https://localhost:xxx/oauth/callback -> OID C токен дескриптора промежуточного программного обеспечения -> аутентификация успешна. Если вы хотите перенаправить на CallbackAsync (маршрут /oauth/callbackAfterLogin) и получить там токены, вы можете напрямую передать URL в методе ChallengeAsync при входе в систему:

await HttpContext.ChallengeAsync("Auth0", 
     new AuthenticationProperties() { RedirectUri = "/oauth/callbackAfterLogin"});
...