2016-08-04 2 views
0

웹 API에서 액세스 토큰과 웹 응용 프로그램에서 :권한 부여 OpenIddict 및 암호 흐름 (자원 소유자 암호 자격 증명 부여)를 사용하여 액세스 토큰 제공 I 데이터베이스에 연결된 웹 API를

services.AddOpenIddict<TestUser, IdentityRole<Guid>, CompleteContext, Guid>() 
       .EnableTokenEndpoint("/connect/token") 
       .AllowPasswordFlow() 
       .AllowRefreshTokenFlow() 
       .DisableHttpsRequirement() 
       .AddEphemeralSigningKey(); 

웹을 API는 유효한 액세스 토큰으로 만 호출 할 수있는 액션을 보호합니다. 이것은 잘 작동합니다.

인증을 위해 동일한 액세스 토큰을 사용해야하는 웹 앱이 있습니다. 사용자는 자신의 자격 증명을 입력하고 웹 응용 프로그램은 액세스 토큰을 얻기 위해이를 API로 보냅니다. 나는 웹 애플 리케이션이 권한 부여를 위해이 액세스 토큰을 사용할 수 있다고 생각했지만 현재 asp.net 코어에서 미들웨어를 설정하는 방법은 없다.

배경 : 웹 앱과 웹 API는 다른 서버에서 실행해야하며 나중에 웹 API를 사용하여 데이터에 액세스하는 모바일 애플리케이션을 만들고 싶습니다. 그래서 토큰을 사용하고 싶습니다. 나는 웹 api가 데이터베이스에 접근 할 수있는 유일한 프로젝트가되기를 원한다.

추가 배경 편집 : 웹 응용 프로그램은 등록, 로그인, 로그 아웃, 이메일 확인 및 사용자 생성 콘텐츠의 일부 상호 작용과 같은 표준 사용자 기능을 갖춘 mvc 6 앱입니다. 이 모든 내용은 데이터베이스에 저장해야합니다. 나중에 모바일 응용 프로그램을 추가해야 할 수도 있으므로 데이터베이스의 데이터를 저장하고 액세스하기 위해 분리 된 웹 API를 갖고 싶습니다. 웹 API의 유일한 목적은 데이터 액세스를 처리하는 것입니다. mvc 웹 앱은 웹 API와 통신하여 데이터를 가져와 저장해야합니다. 사용자는 웹 앱을 사용하려면 인증을 받아야하며 웹 API는 웹 API에 액세스하려면 인증되어야합니다. 제 3 자 응용 프로그램이 없어서 암호 흐름을 생각하게되었습니다. 사용자가 웹 앱에 자신의 자격 증명을 입력하면 웹 API에서 액세스 토큰을 얻을 수 있습니다. 내 계획은 액세스 토큰이 쿠키에 저장되어 웹 앱이 필요할 경우 웹 API를 사용하여 웹 API에 액세스 할 수 있도록하는 것입니다. 이 액세스 토큰을 웹 응용 프로그램의 인증 및 권한 부여에도 사용할 수 있습니까? 어쩌면 사용자 정의 SignInManagerUserManager을 작성하거나 웹 애플리케이션 데이터베이스에 액세스하고 표준 asp.net ID를 사용할 수 있습니다. 아니면 더 좋은 해결책이 있습니까?

답변

1

웹 응용 프로그램이 권한 부여를 위해이 액세스 토큰을 사용할 수 있다고 생각했지만 지금은 asp.net 코어에서 미들웨어를 설정하는 방법을 알지 못합니다.

"리소스 소유자 암호 자격 증명 부여"클라이언트를 구현하는 데 도움이되는 ASP.NET Core에는 아무 것도 없습니다. 다행히도, HttpClient을 사용하면 쉽게 할 수 있습니다. 여기에 당신이 할 수있는 방법 (즉, 오류 처리가 연습 문제로 남겨 주) :

public async Task<IActionResult> SignIn(string username, string password) 
{ 
    if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) 
    { 
     return View("MissingCredentials"); 
    } 

    var request = new HttpRequestMessage(HttpMethod.Post, "http://server.com/connect/token"); 
    request.Content = new FormUrlEncodedContent(new Dictionary<string, string> 
    { 
     ["client_id"] = "your client_id", 
     ["client_secret"] = "your client_secret", 
     ["grant_type"] = "password", 
     ["username"] = "username", 
     ["password"] = "password" 
    }); 

    var response = await client.SendAsync(request, notification.Request.CallCancelled); 
    response.EnsureSuccessStatusCode(); 

    var payload = JObject.Parse(await response.Content.ReadAsStringAsync()); 
    var token = payload.Value<string>("access_token"); 
    if (string.IsNullOrEmpty(token)) 
    { 
     return View("InvalidCredentials"); 
    } 

    var identity = new ClaimsIdentity("Cookies"); 
    identity.AddClaim(new Claim("access_token", token)); 

    return SignIn(new ClaimsPrincipal(identity), "Cookies"); 
} 
또는

, 당신은 당신이 오픈 ID 사용할 수 있도록 할 인증 코드 같은 대화 흐름을 사용하여 고려할 수 ASP.NET 팀이 개발 한 클라이언트 미들웨어를 연결합니다. 이 내용을 이해하기 위해 OpenIddict MVC sample을 제공 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 내 자신을 분명히하지 않았다고 생각한다. 내 웹 API와 웹 앱이 분리되어 있습니다. HttpClient를 사용하여 내 웹 API에서 액세스 토큰을받을 수 있지만이 액세스 토큰을 웹 API뿐만 아니라 웹 응용 프로그램의 승인에 사용하려고합니다. 그러나 웹 api가 더 이상 db 액세스가있는 유일한 인스턴스가 아니더라도 여기에 승인을 위해 표준 asp.net 핵심 ID를 사용하는 것이 더 나을 것입니다. – jasdefer

+0

'하지만이 액세스 토큰을 웹 응용 프로그램의 승인을 위해 사용하고 웹 api에 대해서만 사용하려는 경우> 질문은 "클라이언트에서 웹 응용 프로그램으로 액세스 토큰을 어떻게 전달 하시겠습니까?"인증 쿠키와 달리 액세스 토큰은 클라이언트가 적극적으로 보내야하는 것입니다 (예 : 'Authorization' 헤더 또는 쿼리 문자열에 첨부). – Pinpoint

+0

예, 이것은 제 질문의 일부입니다. 토큰을 쿠키에 저장하는 방법에 대해 생각했지만 일반적으로 요청의 헤더에 액세스 토큰을 포함하기 때문에 이것이 좋은 아이디어인지 확실하지 않습니다. 그러나 웹 앱과 웹 API 모두에 사용할 수있는 액세스 토큰이 하나만 있으면 좋을 것입니다. 나는 최선의 관행에 대해 확신하지 못한다. 아직 개념적 단계에 있으며 asp.net 핵심 ID를 웹 앱에서 구현할 수 있습니다.이 ID는 솔루션의 도움을 받아 액세스 토큰을 사용하여 API에 연결합니다. 하지만 인증에는 2 가지 방법이 있고 db 액세스에는 두 가지 방법이 있습니다. – jasdefer