are*_*ler 5 c# database asp.net authentication asp.net-web-api
我正在尝试为我的 Web api 实现身份验证。我读过有关 api 身份验证的不同技术,令牌技术对我来说是最合理的。
我阅读了有关如何在 ASP.NET 中实现基于令牌的身份验证的不同文章,但它们都依赖于不同的库,例如 OAuth 或 Owin,它们也提供自己的数据库交互方法。
问题是,我已经实现了与抽象存储库和实体的数据库交互,我想了解如何轻松简单地实现 api 身份验证,而不干扰我当前的设计。
(顺便说一句,我的项目是建立在一个空的Web api 项目之上,因此它不附带所有引导程序和身份验证类)。
谢谢
我见过的一种解决方案是使用 .NET 的HttpApplicationState类并将令牌存储在 appstate 中;这样,您就不会直接干扰 Session(这将是 REST 反模式),但您仍然可以跟踪所有当前登录的用户,并使用 HttpContext/HttpActionContext 来 x-ref 应用程序中的活动令牌。使用 HttpActionContext 的好处是它是线程安全的,而 HttpContext 不是,因此您可以锁定应用程序状态,扰乱单个请求的 HttpContext,然后解锁应用程序状态以允许其他线程进入。
由于锁定/解锁应用程序状态确实会占用应用程序,因此我不确定该解决方案的扩展性如何,但无论如何都是如此。。。
概要:当用户首次登录时,会为他/她生成一个令牌并存储在 appstate 中。然后,您可以使用自定义属性来标记任何需要身份验证(或需要存储在该用户上的其他信息)的 API 调用,该属性检查应用程序状态中的该令牌,将令牌名称作为 API 调用中的标头发送(例如“{token -名称:令牌}”)。
这是一个简短的例子:
[在登录时首次激活的控制器方法中:]
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();
//...
Run Code Online (Sandbox Code Playgroud)
[然后在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;
}
Run Code Online (Sandbox Code Playgroud)
[然后在webapi中]
[HttpPost]
[CustomAuthorize]
public HttpResponseMessage NameOfMethod(...)...
Run Code Online (Sandbox Code Playgroud)
...这应该为您检查您的应用程序状态以获取您的用户令牌。只需确保在请求标头中包含您的令牌,并确保在响应标头中包含基本身份验证信息。
归档时间: |
|
查看次数: |
4703 次 |
最近记录: |