web-dev-qa-db-ja.com

Web Api OWIN-各リクエストでトークンを検証する方法

私は2つのアプリケーションを持っています

  1. ASP.NET MVCでのクライアントアプリケーションのビルド
  2. Web API + OWIN上に構築された認証サーバー

次のように認証を計画している

  1. ユーザーログインの場合、クライアントアプリはログインした資格情報で認証サーバーにリクエストを行います。
  2. 認証サーバーはトークンを生成し、クライアントアプリケーションに送り返します。
  3. クライアントアプリケーションは、そのトークンをローカルストレージに保存します。
  4. 後続のリクエストごとに、クライアントアプリはリクエストヘッダーのローカルストレージに保持されているトークンを添付します。

今、CREINT APPのサーバー側では、各リクエストでトークンが来ることを検証する必要がありますIS NOT TEMPERED。

  1. OWINがトークンの生成に使用したキーがわからないため、各リクエストでトークンを検証する方法を提案してください。
  2. クライアントアプリでトークンを検証するコードを記述するか、認証サーバー上にある必要があります。
  3. ユーザー登録、パスワードを認証サーバーに変更するなど、すべてのユーザー管理コードをシフトして、別のクライアントアプリで再利用できるようにすることを計画しています-それは正しい設計プラクティスですか?

これまでのところ、POCを作成するために以下のコードを書きました。

========================= OWIN構成========

    [Assembly: OwinStartup(typeof(WebApi.App_Start.Startup))]
    namespace WebApi.App_Start
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                HttpConfiguration config = new HttpConfiguration();

                ConfigureOAuth(app);

                WebApiConfig.Register(config);
                app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
                app.UseWebApi(config);
            }

            public void ConfigureOAuth(IAppBuilder app)
            {
                OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
                {
                    AllowInsecureHttp = false,
                    TokenEndpointPath = new PathString("/token"),
                    AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
                    Provider = new SimpleAuthorizationServerProvider(),

         };

         // Token Generation

                app.UseOAuthAuthorizationServer(OAuthServerOptions);
                app.UseOAuthBearerAuthentication(new 
 OAuthBearerAuthenticationOptions());

            }
        }
    }

==============================oAuth Provided========================

 public class SimpleAuthorizationServerProvider: OAuthAuthorizationServerProvider
    {
        public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            context.Validated(); 
        }

        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {


            context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

            using (AuthRepository _repo = new AuthRepository())
            {
                IdentityUser user =  _repo.FindUser(context.UserName, context.Password);

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

            var identity = new ClaimsIdentity(context.Options.AuthenticationType);
            identity.AddClaim(new Claim("sub", context.UserName));
            identity.AddClaim(new Claim("role", "user"));

            context.Validated(identity);

        }
    }

助けてください、

おかげで、

@ポール

9
paul sim

OWINがトークンの生成に使用したキーがわからないため、各リクエストでトークンを検証する方法を提案してください。

現在のセットアップは、app.UseOAuthBearerAuthentication()をowinパイプラインに追加した場合、各リクエストで渡されるベアラートークンからユーザーを認証します。現在のユーザーは、HttpContext.Current.Userで見つけることができます。

Authorize属性を使用して、特定のエンドポイントで許可されるユーザーを決定します。ロール「user」を持つユーザーがアクセスを許可される例を次に示します

[Authorize(Roles="user")]
public class ValuesController : ApiController
{
}

クライアントアプリでトークンを検証するコードを記述するか、認証サーバー上にある必要があります。

[〜#〜] no [〜#〜]、クライアントでトークンを検証しません。ユーザーの資格情報が間違っていると、トークンを取得できません。あなたが知る必要があるのはそれだけです。 また、なぜクライアントのトークンを検証する必要があるのですか?

ユーザー登録、パスワードを認証サーバーに変更するなど、すべてのユーザー管理コードをシフトして、別のクライアントアプリで再利用できるようにすることを計画しています-それは正しい設計プラクティスですか?

トークンプロバイダーの再利用は一般的です。なぜすべてのアプリケーションに車輪を発明するのですか?すばらしいものを構築するか、サードパーティを使用して、アプリケーション全体で再利用します。

3
Marcus Höglund

JSON Web Tokens (JWT)およびクレームIDを使用します。発行されたトークンを追跡する必要があるランダムトークンではありません。

JWTは、信頼できる機関によって発行されたパスポートのようなものです。パスポートは署名/スタンプされており、この信頼できる機関によって発行されたものであり、改ざんされていないことを確認できます。つまり、トークンに存在するアクセス権の主張の整合性は、状態をどこにでも保持することなく検証できます。信頼するアプリケーションと機関の間で行われる必要がある唯一の通信は、機関の公開キーの最初の(安全な)ダウンロード(トークンの署名に使用)です。

OpenID Connect( http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims )のような標準のクレームスキーマを使用することもお勧めします。

これらの概念すべての理解を深めるのに役立った、このトピックに関する良い本は、ここにあります: クレームベースのIDおよびアクセス制御のガイド

2
Efrain

トークンが改ざんされていないことを確認する1つの方法は、非対称キーペアを使用して署名することです。IdentityServerはこのアプローチを here のように使用します。

あなたのケースでは、独自の認証を実行している場合、これを自分で実装し、おそらくカスタムミドルウェアですべてのリクエストをチェックして、トークンが有効であることを確認する必要があります。

0
MarkovskI

createsendbacksavelocalStorageおよびJWTトークンに関するすべてのものが正しい場合、多くの方法が_.Net_リクエストごとに制御できます。

サーバー側の制御:

  1. _Web API Core_を使用している場合、コアでMiddlewareを作成して実行時にpiplineとして実行し、詳細情報の確認のために、要求されたコンテキストとチェックトークンを与えることができます: This

  2. _Asp.net MVC_を使用する場合、MVCでActionFilterを使用できます(Asp.Net-Coreにはさらに高度なActionFilterがあります)。各リクエストが実行され、すべてのthisng abountリクエストを確認できます。情報チェック: これ

ClientSide Conftolling:

  1. その後、サーバー側からログインした後にトークンを付与し、ブラウザがリクエストごとにデータをチェックするlocalstorageにデータを保存する必要があります。これらの利点はExpireationtokenlocalstorageに保存すると、あなたとブラウザはこれを使用して詳細を確認できます: This

がんばろう。

0