INVALID_TICKET Получение из CAS в Asp.Net Core2.2 - PullRequest
0 голосов
/ 15 октября 2019

Я должен использовать SSO с CAS Login. Когда я ввожу имя пользователя и пароль, он отправляется на сервер CAS для проверки учетных данных, после успешной проверки я обнаруживаю, что аутентификация является истинной, и теперь я хочу проверить приемный билет и мне нужна некоторая информация, которая поступает в XML из CAS.

Но когда я отправляю билет на serviceValidate URL, то каждый раз, когда я получаю сообщение об ошибке INVALID_TICKET.

<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
    <cas:authenticationFailure code='INVALID_TICKET'>
            Ticket &#039;ST-48062-BNWXlqUWFg97PF4UZZKw-cas.identity.ucsb.edu&#039; not recognized
    </cas:authenticationFailure>
</cas:serviceResponse>

Пожалуйста, помогите мне. Я предоставляю свой код Пожалуйста, проверьте и дайте мне знать, где я не прав. Ожидание благоприятного ответа.

В методе запуска ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddScoped<iUserService, UserService>();
    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(o =>
        {
            o.LoginPath = new PathString("/login");
            o.AccessDeniedPath = new PathString("/access-denied");
            o.Cookie = new CookieBuilder
            {
                Name = ".AspNetCore.CasiEval"
            };
            o.Events = new CookieAuthenticationEvents
            {
                OnSigningIn = async context =>
                {
                    var username = context.Principal.Identity.Name;
                    var userSvc = context.HttpContext.RequestServices.GetRequiredService<iUserService>();
                    var ticket_val = context.HttpContext.Request.Query["ticket"].ToString(); 
                    var state_val= context.HttpContext.Request.Query["state"].ToString();
                    string serviceUrl = $"https%3A%2F%2Flocalhost%3A44357%2FHome%2FIndex%3F";
                    string baseUrl = string.Empty;
                    baseUrl = "https://cas.application.com/cas/serviceValidate?";
                    string casUrl = $"{baseUrl}service={serviceUrl}&ticket={ticket_val}";
                    using (var httpClient = new HttpClient())
                    {
                        // Define Headers
                        httpClient.DefaultRequestHeaders.Accept.Clear();
                        // Add an Accept header for JSON format.  
                         httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                        var response = await httpClient.GetAsync(casUrl);
                        if (response.StatusCode == System.Net.HttpStatusCode.OK)
                        {
                             var result = response.Content.ReadAsStringAsync();
                        } 
                    }

                    ClaimsIdentity identity = new ClaimsIdentity();
                    context.Principal.AddIdentity(identity);
                    await Task.Delay(100);
                    return;// Task.FromResult(0);
                }
            };
        })
        .AddCAS(o =>
        {
             o.CasServerUrlBase = Configuration["CasBaseUrl"];   // Set in `appsettings.json` file.
             o.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
             o.SaveTokens = true;
             o.CallbackPath = new PathString("/Home/Index");
          });

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