注: 以下のコード コメントには多くの質問が散らばっています。それらへの回答も必要です。
私は(他の多くの記事の中でも)次の記事を読みました。
- http://blogs.msdn.com/b/hongmeig1/archive/2012/05/11/how-to-write-a-custom-parameter-binding-to-construct-an-object-either-from-body-または-uri-s-query.aspx から
- http://blogs.msdn.com/b/jmstall/archive/2012/05/11/webapi-parameter-binding-under-the-hood.aspx
Authorization ヘッダーを使用して、Web API の認証をヘッダーで送信したいと考えています。このヘッダーを と呼ばれる ac# クラスに入力したいと思いAuthenticationToken
ます。次に、パラメーター バインディングを行っているときに、以前に作成したこのAuthenticationToken
オブジェクトを取得し、それをコントローラー アクションに渡したいと思います。たとえば、次のコントローラーがある場合
public class MyServiceController : ApiController {
readonly ISecurityService _security;
readonly IMyService _myService;
// constructor values are injected
public MyServiceController(ISecurityService security, IMyService myService) {
_security = security;
_myService = myService;
}
public SomeData GetASpecificItem(AuthenticationToken token, int id) {
if (_security.IsAuthorized(token, Permissions.Read)) {
return myService.DoStuffToGetSomeData(token);
} else {
var msg = new HttpResponseMessage(HttpStatusCode.Forbidden);
throw new HttpResponseException(msg);
}
}
}
および次のパラメータ バインディング クラス
public class AuthenticationTokenParameterBinding
: HttpParameterBinding { // do I need to inherit from a different class?
public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider,
HttpActionContext actionContext,
CancellationToken cancellationToken) {
try {
AuthenticationToken token; // UPDATED: how can i get this from the data
// available from inside this method?
SetValue(actionContext, token);
// is this the correct task to return on successfull parameter binding?
return base.ExecuteBindingAsyn(metadataProvider, actionContext, cancellationToken);
} catch {
return Task<HttpResponseMessage>.Factory.StartNew(() => {
var hpm = new HttpResponseMessage(HttpStatusCode.Unauthorized);
hpm.Headers.Add("WWW-Authenticate","MyCustomScheme");
return hpm;
});
}
}
}
AuthenticationToken
これら 2 つが正しく実装されている場合、コントローラーは承認時に作成されたインスタンスを自動的に取得します。
このプロセスの前に認証する場所がわかりません。また、認証と承認の間でオブジェクトを渡す方法もわかりません。
更新:AuthorizeAttribute
承認がオブジェクトに反する可能性があるため
、カスタムを使用できません:
public SaveResponse Save(AuthenticationToken user, SomeObjectThatNeedsToBeSaved obj) {
// NOTE: permissions are checked between the object and the user, not a role
if (_security.IsAuthorized(user, obj, Permission.Modify, Permission.Create)) {
// NOTE: other permissions we don't know about may need to be checked in the service call
return new SaveResponse {
Success = ISomeService.Save(user, obj); // bool return value
}
} else {
// return 403 Forbidden }
}
コントローラー アクションにトークンを渡す必要がありますが、コントローラーに渡される前にトークンを認証する必要もあります。これらすべてが必ずしもロールベースであるとは限らないため、カスタム内から認証する方法がわかりませんAuthorizeAttribute