私は2つのアプリケーションを持っています
次のように認証を計画している
今、CREINT APPのサーバー側では、各リクエストでトークンが来ることを検証する必要がありますIS NOT TEMPERED。
これまでのところ、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);
}
}
助けてください、
おかげで、
@ポール
OWINがトークンの生成に使用したキーがわからないため、各リクエストでトークンを検証する方法を提案してください。
現在のセットアップは、app.UseOAuthBearerAuthentication()
をowinパイプラインに追加した場合、各リクエストで渡されるベアラートークンからユーザーを認証します。現在のユーザーは、HttpContext.Current.User
で見つけることができます。
Authorize
属性を使用して、特定のエンドポイントで許可されるユーザーを決定します。ロール「user」を持つユーザーがアクセスを許可される例を次に示します
[Authorize(Roles="user")]
public class ValuesController : ApiController
{
}
クライアントアプリでトークンを検証するコードを記述するか、認証サーバー上にある必要があります。
[〜#〜] no [〜#〜]、クライアントでトークンを検証しません。ユーザーの資格情報が間違っていると、トークンを取得できません。あなたが知る必要があるのはそれだけです。 また、なぜクライアントのトークンを検証する必要があるのですか?
ユーザー登録、パスワードを認証サーバーに変更するなど、すべてのユーザー管理コードをシフトして、別のクライアントアプリで再利用できるようにすることを計画しています-それは正しい設計プラクティスですか?
トークンプロバイダーの再利用は一般的です。なぜすべてのアプリケーションに車輪を発明するのですか?すばらしいものを構築するか、サードパーティを使用して、アプリケーション全体で再利用します。
JSON Web Tokens (JWT)およびクレームIDを使用します。発行されたトークンを追跡する必要があるランダムトークンではありません。
JWTは、信頼できる機関によって発行されたパスポートのようなものです。パスポートは署名/スタンプされており、この信頼できる機関によって発行されたものであり、改ざんされていないことを確認できます。つまり、トークンに存在するアクセス権の主張の整合性は、状態をどこにでも保持することなく検証できます。信頼するアプリケーションと機関の間で行われる必要がある唯一の通信は、機関の公開キーの最初の(安全な)ダウンロード(トークンの署名に使用)です。
OpenID Connect( http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims )のような標準のクレームスキーマを使用することもお勧めします。
これらの概念すべての理解を深めるのに役立った、このトピックに関する良い本は、ここにあります: クレームベースのIDおよびアクセス制御のガイド 。
トークンが改ざんされていないことを確認する1つの方法は、非対称キーペアを使用して署名することです。IdentityServerはこのアプローチを here のように使用します。
あなたのケースでは、独自の認証を実行している場合、これを自分で実装し、おそらくカスタムミドルウェアですべてのリクエストをチェックして、トークンが有効であることを確認する必要があります。
create
、sendback
、save
のlocalStorage
およびJWT
トークンに関するすべてのものが正しい場合、多くの方法が_.Net
_リクエストごとに制御できます。
サーバー側の制御:
_Web API Core
_を使用している場合、コアでMiddleware
を作成して実行時にpiplineとして実行し、詳細情報の確認のために、要求されたコンテキストとチェックトークンを与えることができます: This 。
_Asp.net MVC
_を使用する場合、MVCでActionFilter
を使用できます(Asp.Net-Coreにはさらに高度なActionFilterがあります)。各リクエストが実行され、すべてのthisng abountリクエストを確認できます。情報チェック: これ 。
ClientSide Conftolling:
localstorage
にデータを保存する必要があります。これらの利点はExpireation
とtoken
localstorage
に保存すると、あなたとブラウザはこれを使用して詳細を確認できます: This 。がんばろう。