2017-02-15 81 views
0

語境如何自定義WebApi OAuth令牌驗證?

我有一個工作WebApi2應用程序,它採用了承載令牌驗證框,就像是在原來的Visual Studio項目模板。

我想添加一個自定義數據到生成的令牌,然後檢查該自定義數據時,隨後的api調用發生什麼呈現此令牌。

爲了舉例說明,我希望在創建令牌時存儲調用者的IP地址,然後在驗證令牌時檢查使用令牌的調用是否具有相同的IP。

我發現自定義類

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider 

在我的項目,我也看到OAuthOptions被配置爲使用自定義類在啓動時。

我想在哪裏添加我的自定義標記數據(IP):

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 

在這裏我可以把它添加到售票屬性自定義數據。

問題

但是我無法找出什麼方法來覈對令牌有這個數據,和它匹配的實際通話的IP,如果沒有,則認爲該令牌無效?

回答

2

當你決定執行OAuthAuthorizationServerProvider時,你是絕對正確的。現在,你需要添加像這樣:

 private ClaimsIdentity CreateIdentity(User user, string authenticationType) 
    { 
     var identity = new ClaimsIdentity(authenticationType); 

     identity.AddClaim(new Claim(ClaimTypes.Name, user.Login)); 
     identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.UserID.ToString())); // or ip instead of user.UserID if you need 
     return identity; 
    } 

,然後在Grant...方法使用它(例如GrantResourceOwnerCredentials)是這樣的:

 ClaimsIdentity identity = CreateIdentity(user, context.Options.AuthenticationType); 
     context.Validated(identity); 

然後,當請求來到你的WebAPI控制器,你可以查您的數據在您的自定義屬性:

  Claim userIdClaim = ((ClaimsIdentity)actionContext.ControllerContext.RequestContext.Principal.Identity) 
      .Claims 
      .FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier); 

希望它有幫助。

+0

剩餘在IP示例中,我不清楚在哪裏,何時以及如何檢查存儲的IP,並且_reject_請求無效? –

+0

@ g.pickardou在用戶通過授權並將他的ip保存在聲明中後,您可以創建自己的屬性(繼承ActionFilterAttribute)來驗證傳入的請求。然後在OnActionExecuting中,您可以編寫: – grbulat

+0

'var owinContext =(OwinContext)actionContext.Request.Properties [「MS_OwinContext」]; string ip = owinContext.Request.RemoteIpAddress; 權利要求userIpClaim =((ClaimsIdentity)actionContext.ControllerContext.RequestContext.Principal.Identity) .Claims .FirstOrDefault(C => c.Type == ClaimTypes.NameIdentifier); 如果(userIpClaim == NULL \t \t && string.CompareOrdinal(userIpClaim.Value,IP)!= 0){ actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode。未經授權); return; }' – grbulat