Ich wollte JWT-Authentifizierung in meiner MVC-App machen. Ich mache den Autorisierungs-Web-Service in der Web-API, der das Token korrekt zurückgibt. Danach versuche ich Token in Cookie zu speichern.Speichern von JWT-Token in Cookie in MVC 5
[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");
}
Aber jetzt wollte ich dieses Token Header für jede Anfrage hinzufügen. Also entschied ich, dass Action Filter am besten dafür geeignet wären.
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);
}
}
Startup
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)
},
});
}
}
Und dann habe ich gerade markiert Controller das Attribut autorisieren. Es funktioniert gut, als ich es mit POSTMAN angerufen habe.
Aber Action-Filter in MVC werden immer nach Autorisierungsfilter ausgelöst. So habe ich Fragen:
- Wie Token aus Cookie zu jeder Anfrage hinzufügen? Ist es eine gute Übung? Wenn nicht was ich tun sollte?
- Wie wäre es mit CSRF-Attacken und anderen? Wird AntiForgeryTokenAttr die Arbeit machen? Was ist mit Ajax ruft dann?
In diesem schrecklichen _one-undoumened-MS-Auth-API-über-die-andere-mess_ Ihr Ansatz klingt vielversprechend. Danke für das Teilen! Ich vermisse nur einen Teil des Puzzles: Woher bekommst du '' '' loginService.GetToken''' oder wie sieht es aus? – Michael
Ich habe eine weitere Antwort hinzugefügt, da es im Kommentarbereich schwierig sein könnte, diese Login-Service-Implementierung anzuzeigen. – TjDillashaw