私たちは、iPhone アプリを作成する請負業者を雇いました。私は、ServiceStack を使用してそのバックエンド サービスを作成し始めています。
私は一般的に承認に苦労しています。使用する承認の種類とその実装方法です。
ServiceStack、HTTP、および認証については (まだ) よくわかりません。これを読みましたが、おそらくまだ何か間違ったことをしている可能性があります。
既存のレガシー データベースのユーザー名とパスワードを使用して認証します (ただし、それ以外には何もありません。新しいユーザーの登録も、別のアクセス許可もありません。認証のみです)。
そのため、独自のプロバイダーを作成する必要があります。
このチュートリアルCredentialsAuthProvider
の助けを借りて、なんとか実装することができました。
ブラウザでテストすると動作します:
- サービスに電話して 401 を受け取る
- に投稿
auth/credentials
- サービスを再度呼び出して、正しい結果を得る
しかし、Fiddler で試してみると、同じワークフローが機能しないことに気付きました。
POST がauth/credentials
動作します。私はこれを投稿します:
POST http://localhost:52690/auth/credentials?format=json HTTP/1.1
User-Agent: Fiddler
Host: localhost:52690
Content-Length: 74
Content-Type: application/json; charset=utf-8
{
"UserName": "chspe",
"Password": "xyz",
"RememberMe": true
}
...そしてこれを取得します:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Fri, 14 Jun 2013 13:07:35 GMT
X-AspNet-Version: 4.0.30319
X-Powered-By: ServiceStack/3,949 Win32NT/.NET
Set-Cookie: ss-id=3YUUgfwIeJd7PedFK5Th; path=/; HttpOnly
Set-Cookie: ss-pid=zQJ5Z4Vq7AY+BpVwbttj; expires=Tue, 14-Jun-2033 13:07:35 GMT; path=/; HttpOnly
Set-Cookie: ss-opt=perm; expires=Tue, 14-Jun-2033 13:07:35 GMT; path=/; HttpOnly
Set-Cookie: X-UAId=; expires=Tue, 14-Jun-2033 13:07:35 GMT; path=/; HttpOnly
Cache-Control: private
Content-Type: application/json; charset=utf-8
Content-Length: 75
Connection: Close
{"sessionId":"zQJ5Z4Vq7AY+BpVwbttj","userName":"chspe","responseStatus":{}}
は、私にはよく見えますよ。
しかし、実際のサービスへの呼び出しは依然として 401 を返します。
GET http://localhost:52690/hello/world?format=json HTTP/1.1
User-Agent: Fiddler
Host: localhost:52690
Content-Length: 0
Content-Type: application/json; charset=utf-8
応答:
HTTP/1.1 401 Unauthorized
Server: ASP.NET Development Server/10.0.0.0
Date: Fri, 14 Jun 2013 13:07:44 GMT
X-AspNet-Version: 4.0.30319
WWW-Authenticate: credentials realm="/auth/credentials"
X-Powered-By: ServiceStack/3,949 Win32NT/.NET
Cache-Control: private
Content-Length: 0
Connection: Close
(これはServiceStack.Host.AspNet パッケージHelloService
からのもので、属性を追加しただけです)[Authorize]
[Authorize]
属性を削除するとまったく同じ呼び出しが機能するため、実際の要求は正しいです。
CredentialsAuthProvider
が Cookie で動作しているように見えることに気付きました (Set-Cookie: ...
最初の応答に数行あります)。
最初の質問: CredentialsAuthProvider は、ブラウザーではないクライアントにとっても正しい選択ですか?
Fiddler は Cookie を認識しないようですが、iPhone (またはその他のモバイル デバイス)が認識できるかどうかはどうすればわかりますか?
次に、代わりに Basic 認証を使用してみました。
これが私のものBasicAuthProvider
です:
public class MyBasicAuthProvider : BasicAuthProvider
{
public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request)
{
if (request.UserName == "MyUser")
{
return true;
}
}
}
しかし、私は困惑しています-これをブラウザから動作させることさえできません。
サービスの URL をブラウザにロードすると、ウィンドウがポップアップして、ユーザー名とパスワードを要求されます。
正しいユーザー名を入力して Enter キーを押すと、同じウィンドウがすぐに再び表示されます。(正しい) データを入力する頻度に関係なく、何度も何度も... などです。
ただし、ServiceStack が実際に my を使用していることがわかりMyBasicAuthProvider
ます。Visual Studio でブレークポイントを設定すると、ユーザー名が認識されて が返されることがわかるからTrue
です。
2 番目の質問: 何が間違っていますか?
自分のデータベースで Basic Auth を機能させるには、さらに何かする必要がありますか? オーバーライドではAuthenticate
十分ではありませんか?