2016-05-29 93 views
9

一旦生成了WebAPI訪問令牌,WebAPI如何爲下一個請求驗證該令牌?我想知道是否可以使用[Authorize]屬性,它必須將客戶端發送的令牌與服務器端的令牌(如果存儲在某處)進行比較。它只是檢查令牌是否存在而不是它的值?如何在服務器上驗證Web API訪問令牌?

+0

您正在討論訪問令牌以及cookie。你需要澄清你的環境。你在OWIN中使用承載令牌認證嗎?請添加任何與身份驗證相關的代碼,以便我們可以幫助您。 –

+0

@FedericoDipuma是的,我正在使用OWIN。只想知道更多關於令牌的知識。我的問題很簡單。 –

+2

您是否看過[在ASP.NET Web API 2.2中使用個人帳戶和本地登錄保護Web API](http://www.asp.net/web-api/overview/security/individual-accounts-in-web -API)? – Igor

回答

2

祕密密鑰在標頭中發送,請求從客戶端到服務器,並且在使用[授權]屬性的每個請求的服務器上驗證內容。

您可以使用像Telerik(免費)的Fiddler這樣的工具來查看正在傳輸的數據,但不能查看內容(因爲它已被加密)。在使用MVC/WebAPI時,檢查原始Web流量是非常寶貴的,所以我強烈建議。這是一個鏈接到提琴手,雖然其他類似的工具也存在。

http://www.telerik.com/fiddler

爲了回答你問題的第二部分,服務器絕對允許請求繼續進行授權之前檢查密鑰的內容。

+0

這節省了我的一天 –

3

一旦生成訪問令牌,客戶端必須在每個請求的Header中包含訪問令牌。

客戶端可能會在Authorization HTTP標頭中設置訪問令牌。

在服務器端,您應該創建類來處理授權,這是從System.Web.Http.AuthorizeAttribute派生類,像下面:

public class AuthorizationHandlerAttribute : AuthorizeAttribute 
{ 
    string AccessTokenFromRequest = ""; 
    if (actionContext.Request.Headers.Authorization != null) 
    { 
     // get the access token 
     AccessTokenFromRequest = actionContext.Request.Headers.Authorization.Parameter; 
    } 

    string AccessTokenStored = ""; 
    // write some code to get stored access token, probably from database 
    // then assign the value to a variable for later use 

    // compare access token 
    if (AccessTokenFromRequest != AccessTokenStored) 
    { 
     // if the token is not valid then return 401 Http Stasus 
     // or simply call base method 
     base.HandleUnauthorizedRequest(actionContext); 
    } 
} 

然後使用新創建的類並將其安裝在controlleraction您希望防止未經授權的訪問。

public class UsersController : ApiController 
{ 
    [AuthorizationHandler] 
    public User Get(int id) 
    { 
     // only request with valid access token will reach this 
    } 
} 
12

承載令牌

首先,它發出授權令牌的身份提供者或令牌提供者需要具有相同的機鍵設置爲加密/解密的網絡API應用程序:

<的machineKey decryptionKey = 「B7EFF1C5839A624ED0268917EDE82F408D2ECBFAC817」 驗證= 「SHA1」 驗證準則NKEY = 「C2B8DF31AB9624D8066DFDA1A479542825F3B48865C4E47AF6A026F22D853DEC2B3248DF268599BF89EF78B9E86CA05AC73577E0D5A14C45E0267588850B」 /> </system.web>

因爲罩下Bearertoken使用的machineKey加密。 換句話說,如果你沒有相同的設置,你的Web API將無法解密令牌(驗證它)。 這是通過自動完成:使用中間件

Microsoft.Owin.Security.OAuth.dll

可以使用授權屬性在你的web API控制器/動作,如果你想用的用戶名和角色的簡單授權,像這樣:

[Authorize(Roles="Administrators,Managers",Users ="Mike,Laura")] 

如果你想自定義授權,那麼你已經實現自定義授權屬性,它將處理您的web api中的自定義授權。如果不允許用戶通過您會返回一個401未經授權響應:

actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized); 
actionContext.Response.Headers.Add("WWW-Authenticate","Bearer location='http://localhost:8323/account/login'"); 

例如:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)] 
public class CustomAuthorizeAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute 
{ 
    public RulesExampleEnum[] Rules { get; set; } 
    public string Id { get; set; } 
    ..... 
// Summary: 
//  Calls when a process requests authorization. 
// 
// Parameters: 
// actionContext: 
//  The action context, which encapsulates information for using System.Web.Http.Filters.AuthorizationFilterAttribute. 
public virtual void OnAuthorization(HttpActionContext actionContext); 
public virtual Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken); 

,並在您webApiConfig.cs註冊它

config.Filters.Add(new CustomAuthorizeAttribute()); 

並將其應用於Web Api控制器或操作:

[CustomAuthorize(Id = "AnyId", Rules = new RulesExampleEnum[] { RulesExampleEnum.Rule1, RulesExampleEnum.Rule3 })] 
public IEnumerable<object> Get() 
{... 
+1

這對我來說是一個救命稻草,這正是我們試圖在API消費者使用HTTP基本身份驗證(爲了識別機器,訪問控制)進行身份驗證時所要做的,然後我們需要一個OAUTH令牌(爲了識別用戶,爲了權限/身份控制)。 –

相關問題