2014-01-20 49 views
32

我在一個大的.net MVC 5 web解決方案中有一個API特定的項目。我利用WebApi2模板開箱即可通過api驗證用戶身份。使用個人賬戶進行身份驗證,以獲得訪問令牌所需的請求體是:如何在.net WebApi2應用程序中使用OAuth2令牌請求中的額外參數

grant_type=password&username={someuser}&password={somepassword} 

可正常工作。

但是,我需要添加第三維到腳手架的方法「GrantResourceOwnerCredentials」。除了檢查用戶名/密碼之外,我還需要添加一個設備ID,用於限制用戶帳戶對特定設備的訪問。不清楚的是如何將這些額外的請求參數添加到已定義的「OAuthGrantResourceOwnerCredentialsContext」中。此上下文目前爲UserName和Password留出空間,但顯然我需要包含更多內容。

我的問題很簡單,是否有標準的方法來擴展OWIN OAuth2令牌請求的登錄要求以包含更多數據?而且,如何在.NET WebApi2環境中可靠地做到這一點?

回答

86

因爲它往往是這樣,我找到了答案提交問題後,立即...

ApplicationOAuthProvider.cs包含下面的代碼外的開箱

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
{ 
    using (UserManager<IdentityUser> userManager = _userManagerFactory()) 
    { 
     IdentityUser user = await userManager.FindAsync(context.UserName, context.Password); 

     if (user == null) 
     { 
      context.SetError("invalid_grant", "The user name or password is incorrect."); 
      return; 
     } 

     ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user, 
      context.Options.AuthenticationType); 
     ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user, 
      CookieAuthenticationDefaults.AuthenticationType); 
     AuthenticationProperties properties = CreateProperties(context.UserName, data["udid"]); 
     AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties); 
     context.Validated(ticket); 
     context.Request.Context.Authentication.SignIn(cookiesIdentity); 
    } 
} 

通過簡單在方法中添加

var data = await context.Request.ReadFormAsync(); 

,您可以訪問所有發佈的變量在請求體,並根據需要使用它們。就我而言,我在對用戶進行空檢查後立即將其放置,以執行更嚴格的安全檢查。

希望這可以幫助別人!

+1

var data = await context.Request.ReadFormAsync();'真的幫了我。 – Zapnologica

相關問題