web-dev-qa-db-ja.com

サーバーでWeb APIアクセストークンはどのように検証されますか?

WebAPIアクセストークンが生成されたら、WebAPIは次のリクエストでそのトークンをどのように検証しますか? [Authorize]属性。クライアントによって送信されたトークンを、どこかに格納されている場合は、サーバー側のトークンと比較する必要があります。トークンが存在するかどうかを確認するだけで、その値は確認しませんか?

10
Mohan Sharma

ベアラートークン

まず、認証トークンを発行するIDプロバイダーまたはトークンプロバイダーには、暗号化/復号化のためのWeb APIアプリケーションと同じマシンキー設定が必要です。

<machineKey DecryptionKey = "B7EFF1C5839A624ED0268917EDE82F408D2ECBFAC817" validation = "SHA1" validationKey = "C2B8DF31AB9624D8066DFDA1A479542825F3B48865C4E47AF6A026F22D853DEC2B3248DF268599BF89EFAB14E14E50A70E50A14E14E50A70E14A50E14C14E14E75A75E50A14E14E14E75A75E50A14C8E8C14E75A75E70CA70A14C14E8C95E75CA0573A73A75E05CA7314A73E05A73A7314C5E8C5E5F8e8e8f8e1e8f8f8ee5ee5f8f6d5f8買い方であることを確認してください。

内部でBearertokenはMachineKey暗号化を使用しているためです。つまり、同じ設定がない場合、Web APIはトークンを復号化(検証)できません。これは以下によって自動的に行われます:

Microsoft.Owin.Security.OAuth.dll

ミドルウェアを使用します。

次のようなユーザー名またはロールを使用した単純な認証が必要な場合は、Web APIコントローラー/アクションでAuthorize Attributeを使用できます。

[Authorize(Roles="Administrators,Managers",Users ="Mike,Laura")] 

カスタム認証が必要な場合は、Web APIでカスタム認証を処理するカスタム認証属性を実装する必要があります。ユーザーが通過を許可されていない場合は、401 UnAuthorized Responseが返されます。

actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
actionContext.Response.Headers.Add("WWW-Authenticate","Bearer location='http://localhost:8323/account/login'");

例:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class CustomAuthorizeAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute
{
    public RulesExampleEnum[] Rules { get; set; }
    public string Id { get; set; }
    .....
// Summary:
//     Calls when a process requests authorization.
//
// Parameters:
//   actionContext:
//     The action context, which encapsulates information for using System.Web.Http.Filters.AuthorizationFilterAttribute.
public virtual void OnAuthorization(HttpActionContext actionContext);
public virtual Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken);

そしてそれをあなたのwebApiConfig.csに登録します

config.Filters.Add(new CustomAuthorizeAttribute());

そして、それをWeb APIコントローラーまたはアクションに適用します。

[CustomAuthorize(Id = "AnyId", Rules = new RulesExampleEnum[] { RulesExampleEnum.Rule1, RulesExampleEnum.Rule3 })]
public IEnumerable<object> Get()
{...
15
Legends

アクセストークンが生成されたら、クライアントは各リクエストのヘッダー内にアクセストークンを含める必要があります。

クライアントはAuthorization HTTPヘッダー内にアクセストークンを設定できます。

サーバー側では、Authorizationを処理するクラスを作成する必要があります。これは、以下のようなSystem.Web.Http.AuthorizeAttributeからの派生クラスです。

public class AuthorizationHandlerAttribute : AuthorizeAttribute
{
    string AccessTokenFromRequest = "";
    if (actionContext.Request.Headers.Authorization != null)
    {
        // get the access token
        AccessTokenFromRequest = actionContext.Request.Headers.Authorization.Parameter;
    }

    string AccessTokenStored = ""; 
    // write some code to get stored access token, probably from database 
    // then assign the value to a variable for later use

    // compare access token
    if (AccessTokenFromRequest != AccessTokenStored)
    {
        // if the token is not valid then return 401 Http Stasus
        // or simply call base method 
        base.HandleUnauthorizedRequest(actionContext);
    }
}

次に、新しく作成したクラスを使用して、不正アクセスから保護するcontrollerまたはactionにアタッチします。

public class UsersController : ApiController
{
    [AuthorizationHandler]
    public User Get(int id)
    {
        // only request with valid access token will reach this 
    }
}
4
Michael

秘密鍵は、クライアントからサーバーへの要求のヘッダーで送信され、コンテンツは、各要求でサーバーで検証されます。 Authorize]属性が使用されます。

TelerikのFiddler(無料)などのツールを使用して、転送されているデータを確認できますが、コンテンツは確認できません(暗号化されているため)。 MVC/WebAPIを使用する場合、未加工のWebトラフィックを検査することは非常に重要であるため、強くお勧めします。他の同様のツールも存在しますが、ここにフィドラーへのリンクがあります。

http://www.telerik.com/fiddler

質問の2番目の部分に答えるために、サーバーは秘密鍵の内容を完全にチェックしてから、リクエストが承認されたものとして処理されるようにします。

3
HBomb