[英]ASP.NET Web Api Authentication Methods
我正在嘗試為我的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會占用應用程序,我不確定這個解決方案的擴展程度如何,但無論如何它都在這里。 。 。
概述:當用戶首次登錄時,會為他/她生成一個令牌並存儲在appstate中。 然后,您可以使用自定義屬性標記需要身份驗證的任何API調用(或者需要存儲在該用戶上的其他信息),該屬性在appstate中檢查該令牌,並在API調用中將令牌名稱作為標頭發送(例如“{token” -name: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();
//...
[然后在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信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.