2015-09-26 50 views
2

我試圖將OpenId Connect集成到長期存在的Webforms應用程序中。我能夠遷移應用程序以使用OWIN,並且我正在使用OpenIdConnectAuthenticationMiddleware對我的IdP提供程序進行身份驗證。一切都很順利,直到我需要從IdP獲得新身份並設置cookie - 我認爲哪一部分沒有發生。我Startup.Configure方法OpenId Connect中間件未在WebForms應用程序中設置身份驗證Cookie

重要部分:

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
    LoginPath = new PathString("/login.aspx"), 
    CookieManager = new SystemWebCookieManager() //custom cookie manager 
}); 


app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
{ 
    Authority = "https://[development_domain]/core", 
    ClientId = "VDWeb", 
    ResponseType = "code id_token token", 
    Scope = "openid profile", 
    UseTokenLifetime = true, 
    SignInAsAuthenticationType = "Cookies", 
    Notifications = new OpenIdConnectAuthenticationNotifications 
    { 
     SecurityTokenValidated = async n => 
     { 
      var userInfo = await EndpointAndTokenHelper.CallUserInfoEndpoint(n.ProtocolMessage.AccessToken); 

      //now store Preferred name : 
      var prefNameClaim = new Claim(
       Thinktecture.IdentityModel.Client.JwtClaimTypes.PreferredUserName, 
       userInfo.Value<string>("preferred_username")); 

      var myIdentity = new ClaimsIdentity(
       n.AuthenticationTicket.Identity.AuthenticationType, 
       Thinktecture.IdentityModel.Client.JwtClaimTypes.PreferredUserName, 
       Thinktecture.IdentityModel.Client.JwtClaimTypes.Role); 

      myIdentity.AddClaim(prefNameClaim); 

      //add unique_user_key claim 
      var subjectClaim = n.AuthenticationTicket.Identity.FindFirst(Thinktecture.IdentityModel.Client.JwtClaimTypes.Subject); 

      myIdentity.AddClaim(new Claim("unique_user_key", subjectClaim.Value)); 
      myIdentity.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken)); 

      var ticket = new AuthenticationTicket(myIdentity, n.AuthenticationTicket.Properties); 
      var currentUtc = new SystemClock().UtcNow; 
      ticket.Properties.IssuedUtc = currentUtc; 
      ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromHours(12)); 
      n.AuthenticationTicket = ticket;     
     }, 
    } 
}); 

我可以證實AuthentocationTicket填充正確,但身份驗證cookie不會設置。我確實知道這個問題https://katanaproject.codeplex.com/workitem/197,並且我已經嘗試了針對此問題提供的所有解決方法,但沒有任何幫助。有趣的是,當我嘗試在SecurityTokenValidated事件 - n.Response.Cookies.Append("Test", "Test");中放置我自己的cookie時,我可以看到cookie已正確設置。

其中一種解決方法建議實施您自己的CookieManager。讓我感到好奇的是,當我在這個自定義管理器中將一個斷點放入Cookie設置器中時,它並未被擊中,即中間件似乎甚至不嘗試設置cookie。所以我的主要問題 - 中間件到底會在什麼時候嘗試設置cookie?是否當我設置我的AuthenticationTicket?

編輯1:添加更多信息。我試圖與另一個網絡應用程序進行比較,這次是MVC,我配置爲使用相同的IdP並按預期工作。兩款應用的啓動代碼都是相同的。當通過SecurityTokenValidated事件調試時,我可以看到MVC應用程序(工作)創建了System.Security.Principal.WindowsPrincipal身份,而webforms應用程序(非工作)創建了System.Security.Principal.GenericIdentity身份。

我也加入了這個小文檔片斷

app.UseStageMarker(PipelineStage.Authenticate); 
app.Use((context, next) => 
{ 
    var identity = context.Request.User.Identity; 
    return next.Invoke(); 
}); 

只是爲了看看有什麼身份獲取填充這個流水線階段。對於MVC應用程序(工作),我通過設置AuthenticationTicket來看到我添加的身份,對於webforms應用程序,我仍然可以看到未經身份驗證的GenericIdentity。

回答

2

OK,這是令人尷尬的 - 問題是CookieAuthenticationOptions,顯然AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie一樣AuthenticationType = "Cookies"。一旦稍後設置,它工作正常。

+0

您是否使用了特定的解決方案來實施?我正在嘗試做類似的事情,但我很難弄清楚在OpenID Connect上的代碼示例是如何開始的。 –

0

你可以使用默認的cookie管理器,看看是否導致cookie被設置?

+0

嗨,試用默認的cookie管理器。 Auth cookie仍然**沒有**設置,測試cookie(根據我原來的問題)**是**設置。 –

相關問題