2014-11-22 6 views
3

У меня есть приложение Owin Identity и другое приложение, настроенное в виртуальном каталоге. Виртуальное приложение настроено с использованием аутентификации традиционных форм, и оба Web.configs имеют тот же набор <machineKey>. Я могу войти в систему с помощью приложения Identity и увидеть полученный файл cookie. Однако, когда я пытаюсь получить доступ к виртуальному приложению, он говорит, что я не аутентифицирован.Использование cookie ASP.Net Identity 2 в формальной аутентификации

В приложении идентичности, у меня есть следующие настройки:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
    LoginPath = new PathString("/login.aspx"), 
    Provider = new CookieAuthenticationProvider 
    { 
    // Enables the application to validate the security stamp when the user logs in. 
    // This is a security feature which is used when you change a password or add an external login to your account. 
    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
     validateInterval: TimeSpan.FromMinutes(30), 
     regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
    } 
}); 

И в виртуальном приложении, у меня есть разрешение установить следующим образом:

<authorization> 
     <deny users="?" /> 
</authorization> 

Есть указатели, чтобы получить виртуальное приложение распознать набор файлов cookie от Identity?

ответ

12

Файл cookie содержит аутентификационный билет. Формат этого билета отличается для аутентификации промежуточного программного обеспечения cookie и проверки подлинности форм. Невозможно заставить ФАМ прочитать файл cookie, созданный промежуточным программным обеспечением аутентификации cookie. Тем не менее, вы можете написать свой собственный HTTP-модуль, похожий на FAM, чтобы прочитать файл cookie, созданный промежуточным программным обеспечением для проверки подлинности cookie, например.

public class MyHttpModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.AuthenticateRequest += OnApplicationAuthenticateRequest; 
    } 
    private static void OnApplicationAuthenticateRequest(object sender, EventArgs e) 
    { 
     var request = HttpContext.Current.Request; 
     var cookie = request.Cookies.Get(".AspNet.ApplicationCookie"); 
     var ticket = cookie.Value; 
     ticket = ticket.Replace('-', '+').Replace('_', '/'); 

     var padding = 3 - ((ticket.Length + 3) % 4); 
     if (padding != 0) 
      ticket = ticket + new string('=', padding); 

     var bytes = Convert.FromBase64String(ticket); 

     bytes = System.Web.Security.MachineKey.Unprotect(bytes, 
      "Microsoft.Owin.Security.Cookies.CookieAuthenticationMiddleware", 
       "ApplicationCookie", "v1"); 

     using (var memory = new MemoryStream(bytes)) 
     { 
      using (var compression = new GZipStream(memory, 
               CompressionMode.Decompress)) 
      { 
       using (var reader = new BinaryReader(compression)) 
       { 
        reader.ReadInt32(); 
        string authenticationType = reader.ReadString(); 
        reader.ReadString(); 
        reader.ReadString(); 

        int count = reader.ReadInt32(); 

        var claims = new Claim[count]; 
        for (int index = 0; index != count; ++index) 
        { 
         string type = reader.ReadString(); 
         type = type == "\0" ? ClaimTypes.Name : type; 

         string value = reader.ReadString(); 

         string valueType = reader.ReadString(); 
         valueType = valueType == "\0" ? 
             "http://www.w3.org/2001/XMLSchema#string" : 
             valueType; 

         string issuer = reader.ReadString(); 
         issuer = issuer == "\0" ? "LOCAL AUTHORITY" : issuer; 

         string originalIssuer = reader.ReadString(); 
         originalIssuer = originalIssuer == "\0" ? 
                issuer : originalIssuer; 

         claims[index] = new Claim(type, value, 
               valueType, issuer, originalIssuer); 
        } 

        var identity = new ClaimsIdentity(claims, authenticationType, 
                ClaimTypes.Name, ClaimTypes.Role); 

        var principal = new ClaimsPrincipal(identity); 

        System.Threading.Thread.CurrentPrincipal = principal; 
        HttpContext.Current.User = principal; 
       } 
      } 
     } 
    } 


    public void Dispose() { } 
} 

Для объяснения того, что я здесь делаю, перейдите в мою запись в блоге.

http://lbadri.wordpress.com/2014/11/23/reading-katana-cookie-authentication-middlewares-cookie-from-formsauthenticationmodule/

Это слишком большой, чтобы объяснить здесь.

+0

Бадри, это решение работает _perfectly_. Большое вам спасибо за ваш ответ. – ern

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