Web Api 2无状态的用户

本文关键字:用户 状态 Api Web | 更新日期: 2023-09-27 18:11:05

我相信我了解无会话/无状态REST的基础知识,但我在Asp中实现有问题。Net Web Api 2,因为我以前没用过。我已经设置了使用自定义System.Web.Http.AuthorizeAttribute的ApiControllers,如下所示:

public class ApiAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
            if (actionContext.Request.Headers.Authorization != null)
            {
                //Set identity??
                return;
            }
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
    }
}

我有一个包含用户的数据库,我需要使用它们来获得权限来获取/post/put/删除东西,但不想使用会话。我从来没有使用过asp.net Identity,所以我不熟悉它的特性和功能。

我的实现想法是使用用户凭据或api秘密签名对每个请求的用户进行身份验证和获取权限。问题是,通过使用AuthorizeAttribute或类似的东西,如果用户的凭据是正确的,我如何在请求期间向控制器提供用户信息?

更新:就是用这个。基于User (ApiController.User)会话,还是可以用于单个请求。如果是,如何设置呢

Web Api 2无状态的用户

你可以使用HttpContext。项用于保存当前请求的用户数据。在基于验证头设置标识之后,您可以使用

System.Web.HttpContext.Current.Items["userdata"]=userDataObject, 

另一种方法是为身份验证编写自己的动作过滤器(但要非常小心),并将数据传递给控制器。

public class MyAuthAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
       //do authorization here     
        base.OnActionExecuting(filterContext);
        // Create object parameter.
        filterContext.ActionParameters["userdata"] = new User("John", "Smith");
    }
}

then in controller

[MyAuthAttribute]
ActionResult SomeAction(User userdata) //this will have user data
{
}

看起来使用IPrincipal并设置HttpContext.Current.User将允许ApiControllers通过使用

访问该用户
this.User

web API不能访问会话

public override void OnAuthorization(HttpActionContext actionContext)
{
        if (actionContext.Request.Headers.Authorization != null)
        {
            //Check user credentials/token here
            //Get internal user
            IPrincipal principal = new MyOwnCustomPrincipal(internalUser);
            HttpContext.Current.User = principal;
            return;
        }
        actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
}