私は、ほとんど同じ機能を備えた Web サイトとモバイル アプリを必要とするプロジェクトを行っています。そのため、私はAsp.net Web APIを使用して API を構築しています。これは Web サイトとモバイル アプリでも使用されます。
API アドレス: api.domain.com ウェブサイト アドレス: testing.domain.com
問題:
今 api.domain.com で、ユーザーのログインを許可しています。FormsAuthenticationはCookiesで使用されています。
ユーザーが認証されると、許可されているドメインも記載されているSet-Cookieヘッダーと共に200 Http Satusを取得します。
リクエストとレスポンスは次のとおりです。
**Request**
Request URL:http://api.domain.com/account/login
Request Method:POST
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:139
Content-Type:application/x-www-form-urlencoded
Host:api.domain.com
Origin:http://testing.domain.com
Referer:http://testing.domain.com/Login.aspx?ReturnUrl=%2fteacherpanel
User-Agent:Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
Form Dataview URL encoded
__VIEWSTATE:/wEPDwUKMTY1NDU2MTA1MmRkmpJ4YQ4kteUpklwLOmcHppPgq/RHqfw7tilyk8pJp0Y=
UserName:ishan
Password:pass
**Response**
Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Methods:PUT, GET, POST, DELETE, OPTIONS
Access-Control-Allow-Origin:*
Cache-Control:no-cache
Content-Length:0
Date:Sat, 22 Sep 2012 10:23:38 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/7.5
Set-Cookie:.Teacher=A3BD94D26CF733F6F223198ADE40D87C76D8ECC663D7CEDD6E3FF18B0ED23032F6089EF24141E0B65F3F29503A3AC1670C92B9CE4EF7D986974ABE61AB5F0C837245D1A30A8D8E8E058F9AFDD89281CBAB9A3EB98B4A320E689718AF9E76E4911506EBA7FD4244336D8409CFB6D77B179764726B550AB0FFF7A6508658615A57; domain=domain.com, .domain.com; path=/; HttpOnly
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
応答によると、ブラウザは、このドメインdomain.comまたはそのサブドメインへのすべてのリクエストで、この Cookie をサーバーに送信する必要があります。
しかし、これは起こっていません。今朝はうまくいきましたが、公開した後に何が起こったのかわかりません。
また、詳細については、Cookie を設定し、ユーザーがログインしているかどうかを確認するために使用しているコードを示します。
ここでユーザーをログインさせるために、このチェックは api.domain.com の API で実行されます。
[AllowAnonymous]
[HttpPost]
public HttpResponseMessage Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid)
{
Teacher t;
if (Teacher.Login(model.UserName,model.Password,out t))
{
// Roles.AddUserToRole(t.ID.ToString(), "teacher");
FormsAuthentication.SetAuthCookie(t.ID.ToString(), model.RememberMe);
FormsAuthenticationTicket ft = new FormsAuthenticationTicket(
1, // version
t.ID.ToString(), // get username from the form
DateTime.Now, // issue time is now
DateTime.Now.AddMinutes(30), // expires in 10 minutes
true, // cookie is not persistent
"teacher" // role assignment is stored
// in userData
);
string enTicket = FormsAuthentication.Encrypt(ft);
HttpResponseMessage res = Request.CreateResponse(HttpStatusCode.OK);
System.Net.Http.Headers.CookieHeaderValue cokie = new System.Net.Http.Headers.CookieHeaderValue(FormsAuthentication.FormsCookieName, enTicket);
cokie.Domain = "domain.com .domain.com";
IEnumerable<System.Net.Http.Headers.CookieHeaderValue> cookies = new System.Net.Http.Headers.CookieHeaderValue[] { cokie };
res.Headers.AddCookies(cookies);
return res;
}
return Request.CreateResponse(HttpStatusCode.Unauthorized);
}
// If we got this far, something failed, redisplay form
return Request.CreateResponse(HttpStatusCode.Unauthorized);
}
現在、testing.domain.com では、web.config で、ロールに従ってユーザーの認証を確認しています。
<location path="TeacherPanel">
<system.web>
<authorization>
<allow roles="teacher" />
<deny users="?" />
</authorization>
</system.web>
</location>
これらは、この問題を調査して確認した詳細です。どんなことでもお気軽に提案してください。すべての手がかりが役に立ちます。
testing.domain.com の Web 構成の認証セクション
<authentication mode="Forms">
<forms name=".Teacher" loginUrl="Login.aspx" protection="All" path="/" timeout="30" domain=".domain.com" />
</authentication>
api.domain.com の Web 構成の認証セクション
<authentication mode="Forms">
<forms name=".Teacher"
cookieless="UseCookies"
requireSSL="false"
domain=".domain.com"
/>
</authentication>
マシンキーを追加し、Cookie に有効期限を追加した後
認証のためのブラウザによるポスト リクエスト:
POST /account/login HTTP/1.1
Host: api.domain.com
Connection: keep-alive
Content-Length: 123
Origin: http://testing.domain.com
User-Agent: Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
Content-Type: application/x-www-form-urlencoded
Accept: */*
Referer: http://testing.domain.com/TeacherLogin.aspx?ReturnUrl=%2fteacherpanel
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
__VIEWSTATE:/wEPDwUKMTY1NDU2MTA1MmRkCjMwS9YdCRDD3Qsd4GYnLj+tGGg=
UserName:username
Password:pass
サーバーから送信された応答:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/7.5
Set-Cookie: .Teacher=9C8FD43FABDC1817D21272361CBF798BB64C364DECC62E2F5F666D1B2A248076C67737D89B03F515D4D81524345584B11E206B2DDEAD5AA846A15BC17B32D86DF1C95A2943766AB5955C99A8DD0D5984089131838E158A90241B60D40A2D928086486E2BA3DDE95814E7FA303845FBDE235D69F54B6891852A09A80F7465FF8C59957A4D; expires=Wed, 26 Sep 2012 10:02:46 GMT; max-age=432000; domain=.domain.com; path=/; secure; httponly
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS
Access-Control-Allow-Headers: Content-Type
Date: Tue, 25 Sep 2012 10:02:46 GMT
Content-Length: 0
次の Get Request sent to testing.domain.com to test (ブラウザーが Cookie をサーバーに送り返さないため失敗します):
GET / HTTP/1.1
Host: testing.domain.com
Connection: keep-alive
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
Accept: */*
Referer: http://testing.domain.com/TeacherLogin.aspx?ReturnUrl=%2fteacherpanel
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
ブラウザが Cookie を送り返さない理由を推測できますか?