您好我正嘗試在我的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模板。
任何人都可以告訴我我做錯了什麼我一直在試圖弄清楚過去兩天?
有趣我會在WEB.API級別啓用CORS就足夠了 – aleczandru
我已經創建了一個關於如何在AngularJS客戶端上使用新的Web API 2的代碼項目教程http://www.codeproject.com/Articles/742532/Using-Web-API-Individual-User-Account-plus-CORS-En。希望能給出更多細節。 –
我只是試過這個沒有任何成功,我仍然收到錯誤。還有其他建議嗎? –