c# – ASP.NET Web Api身份验证方法
我正在尝试为我的web api实现身份验证.
我已经阅读了关于api身份验证的不同技术,令牌技术对我来说是最合理的. 我阅读了有关如何在asp.net中实现基于令牌的身份验证的不同文章,但它们都依赖于不同的库,如OAuth或Owin,它们也提供了自己的数据库交互方法. 问题是我已经实现了与抽象存储库和实体的数据库交互,我想知道如何在不干扰我当前设计的情况下轻松简单地实现api身份验证. (顺便说一下,我的项目建立在一个空的web api项目之上,所以它并没有提供所有的bootstrap和身份验证类). 谢谢 解决方法
我见过的一个解决方案是使用.NET的
HttpApplicationState类并在appstate中存储令牌;这样你就不会直接搞乱Session(这将是一个REST反模式),但你仍然可以跟踪所有当前登录的用户,并在应用程序中使用HttpContext / HttpActionContext来x-ref活动标记.使用HttpActionContext的好处是它是线程安全的,而HttpContext不是,所以你可以锁定appstate,弄乱单个请求的HttpContext,然后解锁appstate以允许其他线程进入.
由于锁定/解锁appstate会占用应用程序,我不确定这个解决方案的扩展程度如何,但无论如何它都在这里. . . 概要: 这是一个简短的例子: [在控制器方法中首次在登录时激活:] CustomUserObject user = new CustomUserObject(); //store user props string token = Guid.NewGuid().ToString(); //create AppState instance,mine's called _appState //... _appState.Lock(); _appState[token] = user; _appState.UnLock(); //... [然后在global.asax:] public class CustomAuthorize : System.Web.Http.AuthorizeAttribute { HttpRequestMessage request = actionContext.ControllerContext.Request; string token = string.Empty; if (request.Headers.GetValues("token-name") != null) { token = request.Headers.GetValues("token-name").FirstOrDefault().ToString(); IAppStateService appService; //<--- I've created a custom service tier class for appstate stuff //Get appState instance,however makes sense for you. //I'm using repo pattern with UnitOfWork,so mine looks like this... //"IContainer ioc = DependencyResolution.IoC.Initialize();" //"IAppStateService appService = ioc.GetInstance<IAppStateService>();" appService.SetHttpApplicationState(HttpContext.Current.Application); bool isAuthorized = appService.CheckTokenAndDoStuff(token); //inside that method ^^^ you'll do stuff like //"_appState.Lock();" //"if (_appState[token] == null) return false" (or whatever) //"_appState.Unlock();" } if (isAuthorized) { HttpResponseMessage resp = request.CreateResponse(HttpStatusCode.OK); resp.Headers.Add("AuthenticationToken",token); resp.Headers.Add("WWW-Authenticate","Basic"); resp.Headers.Add("AuthenticationStatus","Authorized"); } return isAuthorized; } [然后在webapi] [HttpPost] [CustomAuthorize] public HttpResponseMessage NameOfMethod(...)... …那应该为你的appstate检查你的用户令牌.只需确保在您的请求标头中包含您的令牌,并确保在您的响应标头中包含Basic Auth信息. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |