2016-04-22 4 views
0

ASP.NET Web APIでOAuthを使用して、アプリケーションの呼び出し元にアクセストークンを返します。OAuth - 生成されたアクセストークンを読み取り、応答でクッキーを追加します。

OAuthAuthorizationServerProviderからOAuthプロバイダクラスを継承し、ユーザがGrantResourceOwnerCredentials関数内で認証されると、生成されたアクセストークンを読み取り、いくつかのsalt値を持つハッシュを作成してから、作成したハッシュをクッキーに追加します。

以下は、私のGrantResourceOwnerCredentials機能の簡略化された定義です。

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
{ 
    var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); 

    ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password); 

    if (user == null) 
    { 
     context.SetError("invalid_grant", "The user name or password is incorrect.");  
     return; 
    } 

    ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, OAuthDefaults.AuthenticationType); 
    ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, CookieAuthenticationDefaults.AuthenticationType); 

    //Add claims required on client side. 
    AuthenticationProperties properties = CreateProperties(user.UserName); 
    AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties); 

    //Generate the token behind the scene for given ticket 
    context.Validated(ticket);   
    context.Request.Context.Authentication.SignIn(cookiesIdentity); 
    SetCsrfCookie(context); 
} 

private void SetCsrfCookie(OAuthGrantResourceOwnerCredentialsContext context) 
{   
    var accessToken = "<READ THE GENERATED ACCESS TOKEN HERE>";  //<------ How? 
    if(string.IsNullOrEmpty(accessToken)) return; 

    var csrfToken = Helper.GetHash(accessToken); 
    context.Response.Cookies.Append("XSRF-TOKEN", csrfToken, new CookieOptions {HttpOnly = false}); 
} 

私はここで2つの問題に直面しています。

  1. 最初は、上記のコードのSetCsrfCookie関数で生成されたアクセストークンを読み取る方法です。
  2. 生成されたCookieはクライアント側では受信されません。

は、私はいくつかのOwinMiddleware継承されたクラスの応答を傍受するために、その可能性を知っているし、私は必要なCookieを生成し、応答に接続することができるかもしれませんが、最初に私はそれを試したことのない、第二に、それは良いオプションですいくつかの人々がOwinMiddlewareから派生することは良い習慣ではないことを示唆しているように、私のOAuthプロバイダクラスの中でこのケースを扱うことができます。

答えて

0

私は最終的に私はちょうど下記のようなWebApiConfig.Registerメソッド内trueAccess-Control-Allow-Credentialsレスポンスヘッダを設定した角度側のWeb APIを側で

$httpProvider.defaults.withCredentials = true; 

をコードする以下の行を追加することにより、クッキーの問題を修正するために管理:

var cors = new EnableCorsAttribute(ConfigurationManager.AppSettings["ALLOWED_ORIGIN"], "*", "*") 
{ 
    SupportsCredentials = true 
}; 
config.EnableCors(cors); 

これは私のクッキーの問題を解決しました。私はOwinMiddlewareからクラスを継承したとのInvoke関数内で、私は以下のようなアクセストークンを読み取るためにレスポンスボディにアクセス生成されたアクセストークンにアクセスするために

public override async Task Invoke(IOwinContext context) 
{ 
    var path = context.Request.Path; 

    var stream = context.Response.Body; 
    var buffer = new MemoryStream(); 
    context.Response.Body = buffer; 

    await Next.Invoke(context); 

    var reqStream = new StreamReader(context.Request.Body); 
    reqStream.BaseStream.Position = 0; 
    var data = reqStream.ReadToEnd(); 

    if (path.Equals(new PathString("/token"),StringComparison.CurrentCultureIgnoreCase)) 
    { 
     buffer.Seek(0, SeekOrigin.Begin); 
     var reader = new StreamReader(buffer); 
     var responseBody = await reader.ReadToEndAsync();    
     //check if the response body contains access token if so then do your processing 
    } 

    buffer.Seek(0, SeekOrigin.Begin); 
    await buffer.CopyToAsync(stream); 
} 
関連する問題