web-dev-qa-db-ja.com

.net WebApi2アプリケーション内のOAuth2トークンリクエストで追加のパラメーターをどのように使用しますか

大規模な.net MVC 5 WebソリューションにAPI固有のプロジェクトがあります。私はそのままでWebApi2テンプレートを利用して、APIを介してユーザーを認証しています。認証に個々のアカウントを使用する場合、アクセストークンを取得するために必要なリクエスト本文は次のとおりです。

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

これは期待どおりに機能します。

ただし、足場メソッド「GrantResourceOwnerCredentials」に3番目のディメンションを追加する必要があります。ユーザー名/パスワードを確認することに加えて、ユーザーIDを追加する必要があります。これは、ユーザーアカウントから特定のデバイスへのアクセスを制限するためのものです。明確でないのは、これらの追加のリクエストパラメータを、定義済みの「OAuthGrantResourceOwnerCredentialsContext」に追加する方法です。このコンテキストは現在、ユーザー名とパスワードの余地を作っていますが、明らかにそれを含める必要があります。

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

37
nak5ive

よくあることですが、質問を出した直後に答えを見つけました...

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();

メソッド内では、リクエストの本文で送信されたすべての変数にアクセスして、好きなように使用できます。私の場合は、ユーザーに対するnullチェックの直後に配置して、より制限の厳しいセキュリティチェックを実行しました。

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

95
nak5ive