2016-02-22 2 views
1

Я использовал аутентификацию OpenIdConnect для аутентификации Azure.System.Security.Principal.WindowsIdentity (User.Identity) не заполняет претензии, отправленные Azure AD

Мое приложение является мультифункциональным. Я использовал ADRE AD для проверки подлинности приложения.

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 
     app.UseCookieAuthentication(new CookieAuthenticationOptions { }); 
     app.UseOpenIdConnectAuthentication(
      new OpenIdConnectAuthenticationOptions 
      { ..other fields.. } 

При успешном подписании, после того, как приложение построено и запущено, оно отлично работает. ClaimPrincipal правильно заполнен данными, отправленными Azure AD.

Это ужасно не заполняется, когда одно и то же приложение запускается в другом браузере.

Просьба предложить.

Спасибо заранее, Рахул

+0

Возможно, вы захотите подробнее рассказать о следующем утверждении: «Это ужасно не заполняется, когда одно и то же приложение запускается в другом браузере». Пожалуйста, опишите, что вы подразумеваете под «ужасным сбоем», а также сообщите нам, в каком браузере он работал, и в каком браузере это не удалось. –

+0

После того как я создаю приложение и выбираю IE или Chrome браузера по умолчанию, мое приложение получает претензии, возвращенные Azure AD в качестве эмитента. Теперь ClaimsPrincipal.Current.Identity.IsAuthenticated становится true, если он установлен в любом из контроллеров/действий. Я копирую один и тот же URL-адрес и вставляю его в другой браузер (без браузера по умолчанию). Маркер аутентификации по-прежнему принимается, но ClaimsPrincipal.Current.Identity.IsAuthenticated становится false в контроллере/действии. Это очень необычное поведение. Подскажите пожалуйста –

ответ

0

WindowsIdentity следует использовать только, если приложение аутентификации с помощью встроенной проверки подлинности. Однако здесь вы используете OpenID Connect, поэтому вы должны работать только с ClaimsPrincipal и ClaimsIdentity.

+0

Я использую ** ClaimsPrincipal.Current.Identity.IsAuthenticated ** в моем Contoller/Action для проверки текущего подписанного пользователя аутентифицирован. Я вернусь, когда управление возвращается к Contoller/Action из Start.Auth.cs после успешной аутентификации, полученной от Azure AD. Но он становится ложным в том же случае, когда один и тот же URL-адрес удаляется из любого браузера, не использующего по умолчанию. –

+0

Что такое браузер не по умолчанию? – vibronet

+0

, если я запустил приложение в режиме отладки, и приложение открывается в IE, тогда аутентификация входа в систему будет успешной и заявки будут получены в результате действия контроллера. Теперь, если я копирую-вставляю тот же URL-адрес localhost в chrome (браузер не по умолчанию), тогда аутентификация выполняется успешно, но претензии пусты. Мы используем образец кода Dushyant Gill, упомянутый в этой ссылке - https://github.com/dushyantgill/VipSwapper/tree/master/CloudSense –

2

вопрос в моем приложении был из-за поведения Owin, промежуточного программного обеспечения, которое я использовал в своем приложении.

Проблема с Owin: В OWIN коллекция заголовков ответов является основным местом хранения файлов ответов. System.Web сохраняет файлы ответов в отдельной коллекции HttpContext.Response.Cookies, а затем записывает их в коллекцию Response.Headers непосредственно перед отправкой ответа. Это может привести к конфликту, если OWIN, если оба подхода используются по одному и тому же запросу, так как коллекция Response.Cookies перезапишет любые файлы cookie, установленные через заголовки ответа OWIN.

К сожалению, общего не решена проблема. Заголовок set-cookie из OWIN не может быть надежно повторно обработан и перенаправлен через коллекцию Response.Cookies System.Web. Компоненты OWIN также не могут напрямую записываться в коллекцию Response.Cookies System.Web по умолчанию, поскольку это может поставить под угрозу их независимость от платформы.

В Обходные: Переконфигурируйте CookieAuthenticationMiddleware писать непосредственно в коллекции печенья system.web в

app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      // ... 
      CookieManager = new SystemWebCookieManager() 
     }); 

Определение класса SystemWebCookieManager следующим образом:

public class SystemWebCookieManager : ICookieManager 
{ 
    public string GetRequestCookie(IOwinContext context, string key) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException("context"); 
     } 

     var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName); 
     var cookie = webContext.Request.Cookies[key]; 
     return cookie == null ? null : cookie.Value; 
    } 

    public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException("context"); 
     } 
     if (options == null) 
     { 
      throw new ArgumentNullException("options"); 
     } 

     var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName); 

     bool domainHasValue = !string.IsNullOrEmpty(options.Domain); 
     bool pathHasValue = !string.IsNullOrEmpty(options.Path); 
     bool expiresHasValue = options.Expires.HasValue; 

     var cookie = new HttpCookie(key, value); 
     if (domainHasValue) 
     { 
      cookie.Domain = options.Domain; 
     } 
     if (pathHasValue) 
     { 
      cookie.Path = options.Path; 
     } 
     if (expiresHasValue) 
     { 
      cookie.Expires = options.Expires.Value; 
     } 
     if (options.Secure) 
     { 
      cookie.Secure = true; 
     } 
     if (options.HttpOnly) 
     { 
      cookie.HttpOnly = true; 
     } 

     webContext.Response.AppendCookie(cookie); 
    } 

    public void DeleteCookie(IOwinContext context, string key, CookieOptions options) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException("context"); 
     } 
     if (options == null) 
     { 
      throw new ArgumentNullException("options"); 
     } 

     AppendResponseCookie(
      context, 
      key, 
      string.Empty, 
      new CookieOptions 
      { 
       Path = options.Path, 
       Domain = options.Domain, 
       Expires = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc), 
      }); 
    } 
} 

Он больше не дал мне какой-нибудь петь в вопрос.

+0

Мы относительно уверены, что это зафиксировало проблему, когда наши файлы cookie OWIN Authentication не писались в браузере, поэтому наше промежуточное ПО OpenID Connect отправило нас обратно поставщику удостоверений. Искренне благодарю вас за эту отличную рецензию и, кроме того, за образец кода, который решает проблему. – AaronK

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