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)会话,还是可以用于单个请求。如果是,如何设置呢
你可以使用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);
}