私はMVCアプリケーションでJWT認証を作成したかったのです。トークンを正しく返すWeb APIのAuthorization Webサービスを作っています。その後、私はクッキーにトークンを保存しようとしています。MVC 5のCookieにJWTトークンを格納しています
[HttpPost]
public async Task<ActionResult> Login(LoginDto loginDto)
{
var token = await loginService.GetToken(loginDto);
if (!string.IsNullOrEmpty(token))
{
var cookie = new System.Web.HttpCookie("token", token)
{
HttpOnly = true
};
Response.Cookies.Add(cookie);
return RedirectToAction("Index", "Product");
}
return View("LoginFailed");
}
しかし、今はすべてのリクエストに対してこのトークンをヘッダーに追加したいと考えました。だから私はアクションフィルタがこれを達成するのに最適だろうと決めました。
public class CustomActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var token = filterContext.HttpContext.Request.Cookies.Get("token");
if (token != null)
filterContext.HttpContext.Request.Headers.Add("Authorization", $"Bearer {token}");
base.OnActionExecuting(filterContext);
}
}
スタートアップ
public class Startup
{
public void Configuration(IAppBuilder app)
{
AutofacConfig.Configure();
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
ConfigureOAuth(app);
}
public void ConfigureOAuth(IAppBuilder app)
{
var issuer = System.Configuration.ConfigurationManager.AppSettings["issuer"];
var audience = System.Configuration.ConfigurationManager.AppSettings["appId"];
var secret = TextEncodings.Base64Url.Decode(System.Configuration.ConfigurationManager.AppSettings["secret"]);
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { audience },
IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
{
new SymmetricKeyIssuerSecurityTokenProvider(issuer, secret)
},
});
}
}
そして私はちょうど属性を認可コントローラをマーク。 POSTMANで呼び出すとうまく動作します。
しかし、MVCのアクションフィルタは、認証フィルタの後に常に起動されます。だから私は質問がある:
- どのようにすべての要求にクッキーからトークンを追加するには?いい練習ですか?もし私が何をすべきか?
- csrf攻撃などはどうですか? AntiForgeryTokenAttrは作業を行いますか?それでは、ajaxは何を呼びますか?
そのひどい_one-undoumented-MS-auth-API-over-the-other-mess_あなたのアプローチは有望ですね。共有ありがとう!私はパズルの一部を欠落しているだけです: '' loginService.GetToken'''をどこから取得するのですか? – Michael
コメントセクションにこのログインサービスの実装を表示するのが難しいため、別の回答を追加しました。 – TjDillashaw