姉妹サイトを作成中です。ログインしているユーザーが姉妹サイトにログインできるようにしたい。
ユーザーは両方のデータベースに入力され、一致するトークン (guid) を持っています。
姉妹サイトへの httpwebrequest を介してトークン認証ページにトークンを投稿しています。姉妹サイトは、一致するトークンを使用してデータベースからユーザーを見つけます。
(ここまでは順調ですね)
トークン認証ページ (httpwebrequest 経由) は、フォーム認証がチェックする Cookie を設定することになっています。(その後、ページは姉妹サイトにリダイレクトされ、ユーザーはログインする必要があります。)
問題は最後の部分です。Cookie は、httpwebrequest を介して token-auth ページによって設定されていません。したがって、フォーム認証は失敗し、ユーザー ログインが表示されます。
CookieContainer 経由で httpwebrequest からの Cookie が表示されます。ただし、コンピューターの Cookie に保存されていません...そして、リダイレクトの認証は失敗します。
httpwebrequest 経由で Cookie を保存する方法を知っている人はいますか? これは可能なはずですよね?
ここにいくつかのコードがあります:
HttpWebRequest ページ (ロード時)
Dim baseURL As String = "http://localhost:5894"
Dim poststring As String = String.Format("token={0}", u.toolkit_token)
Dim url As String = baseURL & "/GetAuthToken.aspx"
Dim cookies As CookieContainer = New CookieContainer()
Dim req As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
req.Accept = "*/*"
req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)"
req.Method = "POST"
req.ContentType = "application/x-www-form-urlencoded"
req.AllowAutoRedirect = False
req.CookieContainer = cookies
Dim bytedata() As Byte = Encoding.UTF8.GetBytes(poststring)
req.ContentLength = bytedata.Length
Dim rs As Stream = req.GetRequestStream()
rs.Write(bytedata, 0, bytedata.Length)
rs.Close()
Dim res As HttpWebResponse = DirectCast(req.GetResponse(), HttpWebResponse)
Dim sr As Stream = res.GetResponseStream()
Dim result As String = String.Empty
Dim reader As New StreamReader(sr)
result = reader.ReadToEnd
If result = "200" Then
Response.Redirect(baseURL)
Else
Response.Write("Error: Token Not Authorized.")
End If
認証トークンページ
If Not Request.Form("token") Is Nothing Then
Dim u As BusinessLayer.DataContainer.oUser = Nothing
u = BusinessLayer.BusinessObject.GetUserByToken(Request.Form("token"))
If u IsNot Nothing Then
'-----Set Cookie
Dim cookie As HttpCookie = Nothing
Dim _CookieId As String = Guid.NewGuid().ToString() & "-" & Guid.NewGuid().ToString()
Call BusinessLayer.BusinessObject.UpdateUsersCookieId(_CookieId, u.id)
cookie = New HttpCookie("KeepSignedIn")
cookie.Values.Add("KeepSignedIn", "True")
cookie.Values.Remove("CookieId")
cookie.Values.Add("CookieId", _CookieId)
cookie.Expires = Now.AddYears(1)
Response.Cookies.Add(cookie)
'---------------
Response.Write("200")
End If
End If
Auth-Token ページを取得して Cookie をファイル システムに保存する方法を教えてください。クロスドメインの問題ですか?これについて他にどのようにしますか?
また、トークン ページを使用せずにサイトから直接ログインすると、フォーム認証は Cookie を使用して機能することにも注意してください。私はこのコードを何年も使用してきました。私はそれが問題ではないと確信しています。token-authページを使用する場合、Cookieは認証に対して存在しません。