2014-02-23 112 views
6

您好我正嘗試在我的ASP.NET Web API 2項目中設置OAuth熊標記身份驗證。 我有兩個項目,一個是WEB API項目,另一個是SPA項目。ASP.NET WEB API 2 OWIN身份驗證非端口授權類型

這是我迄今所做的:

我已經創建了OWIN啓動類:

[assembly: OwinStartup(typeof(CodeArt.WebApi.App_Start.Startup))] 

namespace CodeArt.WebApi.App_Start 

{ 
    public class Startup 
    { 
     static Startup() 
     { 
      PublicClientId = "self"; 

     UserManagerFactory =() => new UserManager<UserModel>(new UserStore<UserModel>()); 

     OAuthOptions = new OAuthAuthorizationServerOptions { 
      TokenEndpointPath = new PathString("/Token"), 
      Provider = new OAuthAuthorizatonServer(PublicClientId, UserManagerFactory), 
      AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
      AllowInsecureHttp = true 
     }; 
    } 

    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; } 

    public static Func<UserManager<UserModel>> UserManagerFactory { get; set; } 

    public static string PublicClientId { get; private set; } 
    public void Configuration(IAppBuilder app) 
    { 
     ConfigureAuth(app); 
    } 

    public void ConfigureAuth(IAppBuilder app) 
    { 
     app.UseCookieAuthentication(new CookieAuthenticationOptions()); 
     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalBearer); 
     app.UseOAuthBearerTokens(OAuthOptions); 
    } 
} 

我已經配置的Web API只使用承載令牌認證:

private static void ConfigureBearerTokenAuthentication(HttpConfiguration config) 
    { 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(Startup.OAuthOptions.AuthenticationType)); 

    } 

我已配置WEB API以支持CORS:

private static void ConfigureCrossOriginResourseSharing(HttpConfiguration config) 
    { 
     var cors = new EnableCorsAttribute("*", "*", "*"); 
     config.EnableCors(cors); 
    } 

我創建了OAuthAuthorizationServerProvider class.From這個類我只是設法讓我的代碼調用此方法:如果它裏面的條件總是被執行

public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     if(context.ClientId == null) 
     { 
      context.Validated(); 
     } 

     return Task.FromResult<object>(null); 
    } 

的。

在我的水療項目,我有以下幾點:

這是我的ViewModel:

var vm = { 
     grant_type: "password", 
     userName: ko.observable(), 
     password: ko.observable() 
}; 

當登錄按鈕被點擊我調用這個函數:

 var http = { 
      post:function(url, data) { 
      return $.ajax({ 
       url: url, 
       data: data, 
       type: 'POST', 
       contentType: 'application/json', 
       dataType: 'jsonp' 
      }); 
     } 
    } 

function loginClick() { 
     var model = ko.mapping.toJS(vm.loginModel); 
     var rez = $.param(model); 

     http.post("http://localhost:3439/Token", rez) 
      .done(function (data) { 
       console.log(data); 
      }) 
      .fail(function(eror, stuff, otherstuff) { 
       console.log(eror); 
       console.log(stuff); 
       console.log(otherstuff); 
      }); 
    } 

我第一次嘗試我已經將postType調用dataType設置爲json,並且出現此錯誤:

選項...:3439 /令牌400(錯誤請求)的jquery.js:7845個

選項...:3439 /令牌不「訪問控制允許來源」 頭出現在所請求的資源。原因 '...:3304'因此不被允許訪問。 jquery.js:7845

XMLHttpRequest無法加載... 3439 /令牌。否 「訪問控制 - 允許來源」標題出現在請求的 資源中。起源'... 3304'因此不允許 訪問。

3點代表http://localhost

第二次arround我把它的數據類型設置爲jsonp,我收到一個錯誤,指出不支持的「unsupported_grant_type」。

這兩個調用都使它成爲我上面提到的ValidateClientAuthentication,但它們都作爲失敗的請求發回。

現在我猜測問題更關係到我如何發送數據而不是grand_type,因爲Visual Studion中的SPA模板設置grant_type類型的授權類型:「密碼」就像我一樣。

而且我已閱讀,我必須序列數據不是JSON發送爲了這個來這裏工作的是獲得的發送確切的JSON序列數據: 「grant_type =密碼&的userName = aleczandru &密碼= happynewYear & 的moduleId =模型%2FappPostModels%2FloginModel」

ID型物業獲取的​​設置爲我所有的對象由迪朗達爾框架我的SPA模板。

任何人都可以告訴我我做錯了什麼我一直在試圖弄清楚過去兩天?

回答

17

將以下代碼行添加到GrantResourceOwnerCredentials,這會將標題添加到響應中。

context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); 

更多信息,請參閱: web-api-2-0-cors-and-individual-account-identity

+0

有趣我會在WEB.API級別啓用CORS就足夠了 – aleczandru

+1

我已經創建了一個關於如何在AngularJS客戶端上使用新的Web API 2的代碼項目教程http://www.codeproject.com/Articles/742532/Using-Web-API-Individual-User-Account-plus-CORS-En。希望能給出更多細節。 –

+0

我只是試過這個沒有任何成功,我仍然收到錯誤。還有其他建議嗎? –

8

像羅賓·卡爾鬆說,你應該使用:

app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 

在啓動配置。

並確保它是唯一的cors語句(不要混合它們)和Startup中的第一條語句。

+1

確保安裝了各種Cross-Origin支持nuget包 – JasonCoder

+0

我已經嘗試在全球範圍內啓用CORS(通過OWIN app.UseCors,如您所說)以及單獨的OWIN和Web API策略。我的Policy Resolver正在處理「/ token」URL,但我仍然沒有看到來自服務器的Access-Control-Allow-Origin響應。我是一個跳過並跳過在web.config中全局添加標題。到底是怎麼回事? –

+0

如果服務器出現錯誤,某些瀏覽器(如chrome)會給出允許的訪問錯誤。我有時在開發過程中得到它們。你確定沒有其他事情了嗎?嘗試切換所有身份驗證並訪問簡單的測試控制器。檢查你的日誌和痕跡。 –