web-dev-qa-db-ja.com

Web Api / Owinアーキテクチャでは、「/ token」へのリクエストはどこで処理されますか?

Asp.net WebApi個人アカウントの認証と承認を理解しようとしています。 これ を含むいくつかのチュートリアルをWeb上で見ました。つまり、ユーザーエージェントがユーザー名とパスワードを提供すると、APIはトークンを発行します。このトークンは、クライアントがAPIへの後続の呼び出しで使用して自身を識別します。ユーザーエージェントは、通常は次のようにリクエストを行うことでトークンを受け取ります: http://example.com/Token 。パスは、次のようにStartupクラスで設定されているように見えます。

TokenEndpointPath = new PathString("/Token")

私の問題は、そのパスに一致するコントローラーメソッドが見つからないことです。これはどのように作動しますか?

24
Joe

ASP.NETで個別認証を使用して新しいプロジェクトを作成すると、認証要求を処理するOAuthプロバイダーを使用してソリューションが作成されます。

ソリューションを見ると、ApplicationOAuthProviderクラスのProvidersフォルダーが表示されているはずです。

このクラスは、Webサイトのメンバーを認証するためのすべてのロジックを実装します。構成はスタートアップ時に設定され、OAuthOptionを介してURLエンドポイントをカスタマイズできるようにします。

OAuthOptions = new OAuthAuthorizationServerOptions
{
    TokenEndpointPath = new PathString("/Token"),
    Provider = new ApplicationOAuthProvider(PublicClientId),
    AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
    AllowInsecureHttp = true
};

TokenEndPointパスプロパティは、GrandResourceOwnerCredentialsのGrantResourceOwnerCredentialsメソッドを起動するURLを定義しました。

フィドラーを使用してこの種のボディを認証および使用する場合

 grant_type=password&username=testUserName&password=TestPassword

次のメソッドを渡す必要があります。

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

        ApplicationUser 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 user.GenerateUserIdentityAsync(userManager,
           OAuthDefaults.AuthenticationType);
        ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
            CookieAuthenticationDefaults.AuthenticationType);

        AuthenticationProperties properties = CreateProperties(user.UserName);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);
        context.Request.Context.Authentication.SignIn(cookiesIdentity);
    }

ここで、context.UserNameとcontext.Passwordは、リクエストで使用されるデータで設定されます。 IDが確認された後(ここではEntity Frameworkと、データベース内のいくつかのuserName、Passwordを使用)、Bearerトークンが呼び出し元に送信されます。このベアラートークンは、他の呼び出しの認証に使用できます。

よろしく。

32