您好我正尝试在我的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。希望能给出更多细节。 –
我只是试过这个没有任何成功,我仍然收到错误。还有其他建议吗? –