2014-01-20 2 views
32

大規模な.net MVC 5 Webソリューションには、API固有のプロジェクトがあります。私は、WebApi2テンプレートをそのまま使用して、APIを介してユーザーを認証しています。認証するために、個々のアカウントを使用して、アクセストークンを取得するために必要なリクエストボディは、次のとおりです。期待通り、この作品どのようにOAuth2で余分なパラメータを消費するのですか.net WebApi2アプリケーション内のトークンリクエスト

grant_type=password&username={someuser}&password={somepassword} 

しかし、私はスキャフォールドされたメソッド "GrantResourceOwnerCredentials"に3次元を追加する必要があります。ユーザー名/パスワードを確認するだけでなく、ユーザーアカウントから特定のデバイスへのアクセスを制限するためのデバイスIDを追加する必要があります。明らかにされていないのは、既に定義された "OAuthGrantResourceOwnerCredentialsContext"にこれらの余分なリクエストパラメータを追加する方法です。このコンテキストは、現在、UserNameとPasswordのためのスペースを確保していますが、明らかにもっと多くを含める必要があります。

私の質問は、OWIN OAuth2トークン要求のログイン要件を拡張してより多くのデータを含めるための標準的な方法があるかどうかです。そして、.NET WebApi2環境では、どうやってそれを確実に行いますか?

答えて

86

それはよくあることですが、私はすぐに質問を提出した後...

ApplicationOAuthProvider.csは、単にすることですぐに

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
{ 
    using (UserManager<IdentityUser> userManager = _userManagerFactory()) 
    { 
     IdentityUser user = await userManager.FindAsync(context.UserName, context.Password); 

     if (user == null) 
     { 
      context.SetError("invalid_grant", "The user name or password is incorrect."); 
      return; 
     } 

     ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user, 
      context.Options.AuthenticationType); 
     ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user, 
      CookieAuthenticationDefaults.AuthenticationType); 
     AuthenticationProperties properties = CreateProperties(context.UserName, data["udid"]); 
     AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties); 
     context.Validated(ticket); 
     context.Request.Context.Authentication.SignIn(cookiesIdentity); 
    } 
} 

次のコードが含まれて答えを見つけましたメソッド内

var data = await context.Request.ReadFormAsync(); 

を追加するには、リクエストボディ内のすべての投稿の変数にアクセスし、好きなようにそれらを使用することができます。私の場合は、より制限の厳しいセキュリティチェックを実行するために、ユーザーのヌルチェックの直後にそれを配置しました。

これが誰かを助けることを願っています!

+1

'var data = await context.Request.ReadFormAsync();'は本当に助けてくれました。 – Zapnologica