2014-02-23 116 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)会给出允许的访问错误。我有时在开发过程中得到它们。你确定没有其他事情了吗?尝试切换所有身份验证并访问简单的测试控制器。检查你的日志和痕迹。 –