Я использую аутентификацию токена на предъявителя.Я решил сохранить токен в куки клиента.Я создал пользовательский ServerAuthProvider
, который наследует OAuthAuthorizationServerProvider
.Я переопределил метод TokenEndpointResponse()
, который помещает токен в куки (добавление токена в куки работает нормально):
public override Task TokenEndpointResponse(OAuthTokenEndpointResponseContext context)
{
if(String.IsNullOrEmpty(context.AccessToken))
{
context.Response.Redirect("/Authentication/Login");
}
else
{
context.Response.Cookies.Append("SocialNetworkApp", context.AccessToken);
}
return base.TokenEndpointResponse(context);
}
Затем я создал пользовательский SimpleAuthorizeAttribute
, который наследует AuthorizeAttribute
и я переопределил OnAuthorization()
, который берет токен из куки и добавляет его в заголовки запроса.Но проблема в том, что HandleUnauthorizedRequest()
вызывает всегда.
public class SimpleAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
var tokenKey = "SocialNetworkApp";
var cookies = filterContext.HttpContext.Request.Cookies;
if (cookies.AllKeys.Contains(tokenKey))
{
var token = cookies[tokenKey].Value;
filterContext.HttpContext.Request.Headers.Add("Authorization", "Bearer " + token);
var tokenFrom = filterContext.HttpContext.Request.Headers.Get("Authorization");
}
base.OnAuthorization(filterContext);
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
//if not logged, it will work as normal Authorize and redirect to the Login
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Authentication", action = "Login" }));
}
else
{
//logged and wihout the role to access it - redirect to the custom controller action
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home"}));
}
}
}
Если я устанавливаю заголовок «Авторизация» на стороне клиента (например, почтальоном), он работает нормально.Как я могу решить эту проблему?