2016-07-14 2 views
4

Я использую идентификатор ASP.NET с сервером ADFS. В целях развития я хочу избежать использования сервера ADFS, когда я нахожусь в сетевой среде, где я не могу связаться с сервером ADFS. Вот почему я добавил простое действие контроллера в моем HomeController, который устанавливает вручную, вошедшего в систему пользователя:Как вы вручную установили зарегистрированный пользователь Identity?

#if DEBUG 
    [AllowAnonymous] 
    public ActionResult LogIn() 
    { 
     var claims = new List<Claim>(); 
     claims.Add(new Claim(ClaimTypes.NameIdentifier, "tester")); 

     System.Web.HttpContext.Current.User = new ClaimsPrincipal(new ClaimsIdentity(claims)); 
     System.Threading.Thread.CurrentPrincipal = System.Web.HttpContext.Current.User; 

     return Redirect("Home/Index"); 
    } 
#endif 

и метод конфигурации Owin:

public void Configuration(IAppBuilder app) 
    { 
     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions() { }); 

     app.UseWsFederationAuthentication(
      new WsFederationAuthenticationOptions 
      { 
       Wtrealm = realm, 
       MetadataAddress = adfsMetadata 
      }); 
    } 

закомментировать ту часть, где я использую WsFederation Аутентификация нет проблем, таким образом, нет ссылки на мой текущий сервер ADFS.

Проблема: Когда я перенаправлен на действие Home/Index (у которого есть атрибут Authorize), идентификатор ASP.NET не распознает мой ClaimsPrincipal как действительный логин, поэтому я перенаправлен на главную/Действие входа, которое постоянно создает петлю между Домой/Логин и Главная/Индекс.

Мой вопрос: как заставить ASP.NET принять ClaimsPrincipal, созданную выше как действительный логин?

ответ

4

Проблема с вами - cookie не установлен, поэтому информация пользователя не сохраняется в HTTP-запросах. Ваш подход работает только в пределах одного вызова (есть использует для этого, но не для вас)

Вы все еще можете использовать IAuthenticationManager из Owin установить печенье:

#if DEBUG 
    [AllowAnonymous] 
    public ActionResult LogIn() 
    { 
     var identity = new ClaimsIdentity("ApplicationCookie", ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType); 
     identity.AddClaim(new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "Active Directory")); 
     identity.AddClaim(new Claim(ClaimTypes.Name, "Testy McTestface")); 
     identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, "testUser")); 

     IAuthenticationManager authenticationManager = HttpContext.GetOwinContext().Authentication; 
     authenticationManager.SignOut("ApplicationCookie"); 
     authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, identity); 

     return Redirect("Home/Index"); 
    } 
#endif 

Вам понадобится NuGet пакеты Microsoft.Owin.Security.Cookies, Microsoft.Owin.Host.SystemWeb. Другие объяснения в моей blog-post о проверке подлинности с AD

Вы также должны убедиться, что CookieAuthenticationMiddleware настроен correclty:

public void Configuration(IAppBuilder app) 
    { 
     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = "ApplicationCookie", 
      LoginPath = new PathString("/Home/Login"), 
      Provider = new CookieAuthenticationProvider(), 
      CookieName = "ApplicationCookie", 
      CookieHttpOnly = true, 
      ExpireTimeSpan = TimeSpan.FromHours(1), 
     }); 

     app.UseWsFederationAuthentication(
      new WsFederationAuthenticationOptions 
      { 
       Wtrealm = realm, 
       MetadataAddress = adfsMetadata 
      }); 
    } 

Особенно платить аутентификацию AuthenticationType значение - оно должно соответствовать значению в ClaimsIdentity конструктора. В противном случае cookie не будет установлен или вы не сможете выйти из системы.

+0

Спасибо за помощь! По какой-то причине он по-прежнему не устанавливает cookie. Это может быть случай случайного использования одних и тех же классов в разных пакетах nuget. Или, может быть, мой файл конфигурации Owin неверен. Я обновил свой вопрос, как выглядит моя конфигурация Owin на всякий случай. Теперь я ухожу из работы, поэтому я не могу повторить попытку до завтра. – ohyeah

+0

@ohyeah см. Мое обновление. – trailmax

+0

Отлично работает, спасибо! Я заметил, что этот ответ в значительной степени не зависит от ADFS, поэтому я отредактировал ваш код для моего окончательного решения. Надеюсь, это достаточно просто для всех, кому это нужно, просто скопировать и вставить в свои проекты. – ohyeah

Смежные вопросы