簡體   English   中英

ASP.NET Web Api身份驗證方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM