質問: asp.net web apiのjwt認証 私は私のweb apiアプリケーションでjwtベアラトークン(json web token)をサポートしようとしていますが、迷子になります。.net coreとowinアプリケーションがサポートされています。 現在iisでアプリケーションをホストしています。アプリケーションでこの認証モジュールを実現するにはどうすればいいですか。フォーム/ windows認証を使用するのと同じように、<authentication>構成を使用する方法はありますか?
回答: これは、asp.net core web apiでjwtトークンを使用したクレームベース認証の非常に最小限で安全な実装です。まず第一に、ユーザーに割り当てられたクレームを含むjwtトークンを返すエンドポイントを公開する必要があります。 /// <summary> /// login provides api to verify user and returns authentication token. /// api path: api/account/login /// </summary> /// <param name="paramuser">username and password</param> /// <returns>{token: [token] }</returns> [httppost("login")] [allowanonymous] public async task<iactionresult> login([frombody] userrequestvm paramuser, cancellationtoken ct) { var result = await userapplication.passwordsigninasync(paramuser.email, paramuser.password, false, lockoutonfailure: false); if (result.succeeded) { userrequestvm request = new userrequestvm(); request.email = paramuser.email; applicationuser userdetails = await this.getuserbyemail(request); list<applicationclaim> userclaims = await this.claimapplication.getlistbyuser(userdetails); var claims = new claimsidentity(new claim[] { new claim(jwtregisteredclaimnames.sub, paramuser.email.tostring()), new claim(userid, userdetails.userid.tostring()) }); //adding userclaims to jwt claims foreach (var item in userclaims) { claims.addclaim(new claim(item.claimcode, string.empty)); } var tokenhandler = new jwtsecuritytokenhandler(); // this information will be retrived from you configuration //i have injected configuration provider service into my controller var encryptionkey = configuration["jwt:encryptionkey"]; var key = encoding.ascii.getbytes(encryptionkey); var tokendescriptor = new securitytokendescriptor { issuer = configuration["jwt:issuer"], subject = claims, // this information will be retrived from you configuration //i have injected configuration provider service into my controller expires = datetime.utcnow.addminutes(convert.todouble(configuration["jwt:expirytimeinminutes"])), //algorithm to sign the token signingcredentials = new signingcredentials(new symmetricsecuritykey(key), securityalgorithms.hmacsha256signature) }; var token = tokenhandler.createtoken(tokendescriptor); var tokenstring = tokenhandler.writetoken(token); return ok(new { token = tokenstring }); } return badrequest("wrong username or password"); } このようにデフォルトの認証サービスとしてjwt認証を追加するには、 startup.cs 内のconfigureservicesでサービスに認証を追加する必要があります。services.addauthentication(x => { x.defaultauthenticatescheme = jwtbearerdefaults.authenticationscheme; x.defaultchallengescheme = jwtbearerdefaults.authenticationscheme; }) .addjwtbearer(cfg => { cfg.requirehttpsmetadata = false; cfg.savetoken = true; cfg.tokenvalidationparameters = new tokenvalidationparameters() { //validateissuersigningkey = true, issuersigningkey = new symmetricsecuritykey(encoding.utf8.getbytes(configuration["jwt:encryptionkey"])), validateaudience = false, validatelifetime = true, validissuer = configuration["jwt:issuer"], //validaudience = configuration["jwt:audience"], //issuersigningkey = new symmetricsecuritykey(encoding.utf8.getbytes(configuration["jwt:key"])), }; }); これで、認可サービスにポリシーを追加できます。services.addauthorization(options => { options.addpolicy("yourpolicynamehere", policy => policy.requireclaim("yourclaimnamehere")); }); _あるいは_ 、これはあなたのアプリケーションの起動時に一度だけ実行され、次のようなポリシーに追加されるのであなたはあなたのデータベースからあなたのすべての要求を投入することもできます。 services.addauthorization(async options => { var claimlist = await claimapplication.getlist(applicationclaim); foreach (var item in claimlist) { options.addpolicy(item.claimcode, policy => policy.requireclaim(item.claimcode)); } }); これで、許可したいメソッドのいずれかにpolicyフィルターを設定できます。 [httppost("update")] [authorize(policy = "acc_up")] public async task<iactionresult> update([frombody] userrequestvm requestvm, cancellationtoken ct) { //your logic goes here } お役に立てれば