2

現在、Web API での owin ベアラー トークン認証の学習段階にあります。このコードは、トークンおよび Cookie ベースの認証を使用して実装されています。コードは

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        try
        {

              using (UserManager<ApplicationUser> userManager = userManagerFactory())
                {

                    ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);


                    if (user == null || user.IsDeleted)
                    {
                        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);

                    var roleName = await GetRoleName(user.Roles.First().RoleId);

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

        }
        catch (Exception ex)
        {

            throw ex;
        }
    }

        public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            // Resource owner password credentials does not provide a client ID.
            if (context.ClientId == null)
            {
                context.Validated();
            }

            return Task.FromResult<object>(null);
        }

        public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
        {
            if (context.ClientId == _publicClientId)
            {
                Uri expectedRootUri = new Uri(context.Request.Uri, "/");

                if (expectedRootUri.AbsoluteUri == context.RedirectUri)
                {
                    context.Validated();
                }
            }

            return Task.FromResult<object>(null);
        }

コードは同僚によって実装されており、疑問があります。

  1. トークン認証は、生成されたトークンに基づいています。ロールが「管理者」であるユーザーのトークンを生成しました。ユーザーが「管理者」ロールを持っているため、制限されたアクションにアクセスできるようになりました。しかしその後、同じ古いユーザーの役割を「ユーザー」に変更しました。現在、同じ古いトークンを使用して、彼が「管理者」にいなくてもリソースにアクセスできます。実際、これが追加のカスタムロジックで実装されているという記事をいくつか読みました。大丈夫です

  2. 今、私はユーザーパスワードを他のパスワードに変更しました。これで、同じ古いトークンでリソースにアクセスできます。短命のトークンを作成しても、これは良くないと思います。

誰もこれを逮捕するためにガイドしてください、または私は何かを逃しましたか? 「Authorization」ヘッダーでアクションを呼び出すときに実際に呼び出すメソッド

4

1 に答える 1

0

付与されたアクセス トークンを取り消したり、「ログオフ」したりする「直接的な」方法はありません。ユーザーがトークンを持っている場合、トークンの有効期限が切れるまで、セキュリティで保護されたサーバー リソースにアクセスできます。間接的な方法は、ユーザーに付与された各トークンの token_id をデータベースに保存し、呼び出しごとに DB チェックを行うことですが、これはお勧めしません。

そのため、状況によっては、アクセス トークンと共にリフレッシュ トークンを使用する方が適切な場合があります。したがって、有効期間が短いアクセス トークン (15 分) を発行し、更新トークンを使用して新しいアクセス トークンを取得します。ここでの良い点は、リフレッシュ トークンをバックエンド システムから取り消すことができるため、トークンを制御できることです。

ASP.NET Web API で OAuth リフレッシュ トークンを有効にする方法に関する私の投稿を確認してください。

于 2014-10-25T23:18:13.880 に答える