2014-02-23 2 views
6

안녕하세요, 저는 ASP.NET 웹 API 2 프로젝트에서 OAuth 베어러 토큰 인증을 설정하려고합니다. 두 개의 프로젝트 중 하나는 WEB API 프로젝트이고 나머지 하나는 SPA 프로젝트입니다.ASP.NET 웹 API 2 OWIN 인증이 실패했습니다. grant_Type

[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); 
    } 
} 

나는 웹 API는 토큰 인증 베어러 사용하도록 구성했다 :

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

    } 
나는 OWIN 시작 클래스를 생성 한

: 여기

내가 지금까지 한 일이다

CORS를 지원하도록 WEB API를 구성했습니다 :

private static void ConfigureCrossOriginResourseSharing(HttpConfiguration config) 
    { 
     var cors = new EnableCorsAttribute("*", "*", "*"); 
     config.EnableCors(cors); 
    } 
내부 그것의 조건이 항상 실행됩니다 경우

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

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

:

나는 OAuthAuthorizationServerProvider class.From에게 난 단지 내 코드 호출이 방법을 만들기 위해이 관리 클래스를 만들었습니다. 내 스파 프로젝트에

나는 다음과 같은 한 :

이 내 뷰 모델입니다 :

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); 
      }); 
    } 

내 첫 번째 시도를 게시물을 dataType을 json으로 설정했으며이 오류가 발생했습니다.

01 23,516,

옵션 ... : 3439/토큰 400 (잘못된 요청) jquery.js : 7845 개

옵션 ... : 3439/토큰 없음 '액세스 제어 - 허용 - 원산지는' 헤더는 요청 된 자원에 존재 . 따라서 Origin '... : 3304'는 액세스가 허용되지 않습니다. jquery.js : 7845

XMLHttpRequest를로드 할 수 없습니다 ... 3439/Token. 아니요 요청한 리소스에 'Access-Control-Allow-Origin'헤더가 있습니다. 따라서 Origin '... 3304'는 (는) 에 액세스 할 수 없습니다.

3 개의 도트는 http://localhost을 나타냅니다.

두 번째로 arround 데이터 유형을 jsonp로 설정했는데 지원되지 않는 "unsupported_grant_type"오류가 표시되었습니다.

두 호출 모두 위에서 언급 한 ValidateClientAuthentication을 호출하지만 둘 다 실패한 요청으로 다시 전송됩니다.

이제 Visual Studion의 SPA 템플릿이 grant_type : grant_type : "password"로 설정했기 때문에 문제가 grand_type 대신 데이터를 보내는 방식과 관련이 있다고 생각합니다. "grant_type = 비밀번호 &는 userName = aleczandru & 암호 = happynewYear : 내가 여기서 일이 순서대로 JSON에 보내지는 데이터를 직렬화해야한다는 읽고 또한

가 전송의 얻을 정확한 JSON 직렬화 된 데이터입니다 Durandal 프레임 워크 내 SPA 템플릿 내 모든 개체에 대한 % 2FappPostModels % 2FloginModel "

모델 ID 속성의 get의 설정 & 의 moduleID = 모델.

내가 잘못하고있는 것을 누군가에게 말해 줄 수 있습니까? 나는 지난 2 일 동안 이것을 알아 내려고 노력하고 있습니까?

답변

17

다음 코드 줄을 GrantResourceOwnerCredentials에 추가하면 헤더가 응답에 추가됩니다. 로빈 카를 말했듯이 web-api-2-0-cors-and-individual-account-identity

+0

흥미로운 것은 WEB.API 수준에서 CORS를 활성화하면 충분하다는 것입니다. – aleczandru

+1

AngularJS 클라이언트 http://www.codeproject.com에서 새로운 웹 API 2를 사용하는 방법에 대한 코드 프로젝트 자습서를 만들었습니다./Articles/742532/Using-Web-API-Individual-User-Account-plus-CORS-En. 자세한 내용을 알려 주시기 바랍니다. –

+0

나는 어떤 성공도없이 이것을 시도했지만, 나는 여전히 오류를 얻고있다. 다른 제안? –

8

, 당신은 사용해야합니다 :

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

자세한 내용은 다음을 참조

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

를 시작 프로그램 구성.

그리고 시작 메뉴얼에서 첫 번째 명령문이 유일한 cors 문 (혼합하지 않음)인지 확인하십시오.

+1

다양한 Cross-Origin 지원 너겟 패키지를 설치하십시오. – JasonCoder

+0

CORS를 전역 적으로 (OWIN app.UseCors를 통해) 사용하도록 설정하고 별도의 OWIN 및 Web API 정책을 사용하여 시도했습니다. "/ token"URL이 Policy Resolver에 의해 올바르게 처리되고 있으며 서버에서 Access-Control-Allow-Origin 응답을 보지 못했습니다. 필자는 web.config에서 헤더를 전역 적으로 추가하는 것을 건너 뛰고 있습니다. 무슨 일 이니? –

+0

일부 브라우저 (예 : 크롬)는 서버에 오류가있는 경우 액세스 허용 원점 오류를 제공합니다. 나는 개발 도중 때때로 그것들을 얻는다. 다른 일이 없다고 확신합니까? 모든 인증을 전환하고 간단한 testcontroller에 액세스하십시오. 로그와 흔적을 확인하십시오. –

관련 문제