我使用承载令牌认证 . 我've decided to store a token in the client'的 Cookies . 我创建了继承 OAuthAuthorizationServerProvider 的自定义 ServerAuthProvider . 我已经覆盖了将令牌放入cookie中的 TokenEndpointResponse() 方法(将令牌添加到cookie中工作正常):

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);
}

然后我创建了一个继承 AuthorizeAttribute 的自定义 SimpleAuthorizeAttribute 并且我覆盖了 OnAuthorization() ,它从cookie中获取了令牌并将其添加到请求的 Headers 中 . 但问题是, 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"}));
        }
    }
}

如果我在客户端设置“授权” Headers (例如Postman),它可以正常工作 . 我怎么解决这个问题?