OWIN удостоверяване в MVC 5 цикли, докато User.IsAuthenticated = false

Опитвам се да внедря удостоверяване и оторизация в приложение MVC 5.1. Удостоверяването се извършва чрез Facebook, който е персонализиран. (Мога да публикувам този код, ако е необходимо.) След като FB удостовери и изпрати обратно кода, се извиква методът Authenticate на услугата за удостоверяване, за да влезе потребителят в приложението. В самото приложение няма код за удостоверяване (по този начин не се използват услуги за идентичност или други услуги за членство).

    public async Task<ActionResult> Connect(string code)
    {
        if (code == null)
        {
            return RedirectToAction("Index", "Home");
        }
        else
        {
            // get access token
            var accessToken = await nApplication.FacebookClient.AccessTokenAsync(code);
            // get user info from facebook
            var meResult = await nApplication.FacebookClient.MeResultAsync(accessToken);

            nApplication.NRepository.SaveChanges();
            nAuthorization.Authenticate(member);

            return RedirectToAction("Index");
        }
    }

nAuthorization.Authenticate(member); създава списък с искове и изпълнява OWIN SignIn,

    claims.Add(new Claim(ClaimTypes.Name, member.Name));
    claims.Add(new Claim(ClaimTypes.Role, "Member"));
    var claimIdentity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
    owinContext.Authentication.SignIn(new AuthenticationProperties { IsPersistent = true }, claimIdentity);

Използвам атрибута Authorize от пространството на имената Mvc. Но в този момент /Profile/Authenticate/, който е моят Owin LoginPath get, се извиква отново и отново, за да пренасочи потребителя към FB и да се върне към Connect метода по-горе.

    [Authorize(Roles = "Member")]
    public async Task<ActionResult> Index(int? id)

Проверих свойството User в контролера и то не е удостоверено. Бих могъл да задам това на нов ClaimsPrincipal, но бих искал кодът за удостоверяване да е независим от HttpContext. И изглежда не е правилното решение.

Моят Startup клас съдържа:

    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        LoginPath = new PathString("/Profile/Authenticate/"),
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        CookieSecure = CookieSecureOption.Always,
        ReturnUrlParameter = "next"
    });

Може би пропускам нещо напълно фундаментално? Всички указания биха помогнали, прегледах статии като следните, но без резултат:


person kowsheek    schedule 22.04.2014    source източник
comment
Настроили ли сте някакви глобални филтри?   -  person Adrian Toman    schedule 22.04.2014
comment
leastprivilege.com/2012/09 /24/ Решава проблема, че IsAuthenticated не е вярно. Но все още остана в цикъл от 401 от сървъра.   -  person kowsheek    schedule 23.04.2014
comment
Решавали ли сте някога този проблем, намирам, че ако коментирам LoginPath, всичко работи добре. с него получавам безкрайни цикли?   -  person Rippo    schedule 02.02.2016


Отговори (1)


Мисля, че това ще реши проблема ви... при мен проработи:

Добавете празен метод във вашия файл global.asax.cs:

protected void Session_Start()
{
}

по някаква причина сесийната бисквитка на asp.net не се настройва в точното време без това. Разработчиците на Thinktecture смятат, че това може да се случва, ако вашето уеб приложение използва http, а вашият доставчик на самоличност използва https, но все още не съм потвърдил това.

person Michael Schulz    schedule 10.03.2015