2016-01-21 12 views
5

カスタムロールとユーザーストアを持つAsp.Net MVCアプリケーション(バージョン6.0.0-rc1-final)があります。 strugglingの後で、私は最終的に働くログインメカニズムを作成することができました。しかし、今私はクリーンなログアウトを作成するためにトラブルがあります。コントローラの私のログアウトのコードは、現在どのようなものか:ログアウト後にCookieが削除されないAsp.Net 5 Identity 3.0

public async Task<ActionResult> Logout() 
{ 
    if (User.Identity.IsAuthenticated) 
    { 
    await SignInManager.SignOutAsync(); 

    } 

    return RedirectToAction("Index", "App"); 
} 

このコードの問題は、一つのクッキーが削除されていないことを、次のとおりです。.AspNet.Microsoft.AspNet.Identity.Application

限り私はクッキーを手動で削除しないので、アプリケーションは汚れた状態にあり、User.Identityはnullであるため、nullポインタ例外をスローします。

同様のシナリオを説明しているquestion on stackoverflowが見つかりました。しかし、私がSystem.Webを持たないMVC 6を使用しているので、そこの解決策は私にとっては適切ではありません。

私はまた、正常に動作するサンプルソリューションを持っています。このソリューションでは、言及されたクッキーは決して作成されません。おそらく、適切な解決策は、ログアウト後にクッキーを削除するのではなく、何らかの形でクッキーの作成を防ぐことです。

+0

@ Maxisam、その間に解決策を見つけましたか? –

+0

しかし、私はそれが本当に問題ではないと言ったように。それは認証データとは何の関係もないようです。 – maxisam

答えて

1

RedirectToActionは、SignOutAsyncが発行するIdentity ServerのエンドセッションURLへのリダイレクトを上書きしてしまうという問題があります。

(同じ問題について同じ説明がMicrosoftのHaoKでhereを与えている。)

編集:ソリューションは、最終的なSignOutAsyncAuthenticationPropertiesオブジェクトにリダイレクトURLを送信することです:

// in some controller/handler, notice the "bare" Task return value 
public async Task LogoutAction() 
{ 
    // SomeOtherPage is where we redirect to after signout 
    await MyCustomSignOut("/SomeOtherPage"); 
} 

// probably in some utility service 
public async Task MyCustomSignOut(string redirectUri) 
{ 
    // inject IHttpContextAccessor to get "context" 
    await context.SignOutAsync("Cookies"); 
    var prop = new AuthenticationProperties() 
    { 
     RedirectUri = redirectUri 
    }); 
    // after signout this will redirect to your provided target 
    await context.SignOutAsync("oidc", prop); 
} 
+1

残念ながら、私はあなたのソリューションを検証することができません。なぜなら、私はこのプロジェクトのためにこれ以上作業していませんが、あなたのソリューションは非常に有望です。 –

+0

ええ、私はあなたが移動したと思っていましたが、私はこの問題を頻繁に見てきました。自分でそれを追跡するために私に数日間かかりました! – McGuireV10

1

私は、ログアウト・アクションの後にクッキーを削除して手動でログアウトした後、自分のアプリケーションのダーティ状態を修正することができます:クッキーは、サーバーから削除できないので、直接私はすでに既存のクッキーを上書き

public async Task<ActionResult> Logout() 
{ 
    if (User.Identity.IsAuthenticated) 
    { 
     await SignInManager.SignOutAsync(); 
    } 

    foreach (var key in HttpContext.Request.Cookies.Keys) 
    { 
     HttpContext.Response.Cookies.Append(key, "", new CookieOptions() { Expires = DateTime.Now.AddDays(-1) }); 
    } 
    return RedirectToAction("Index", "App"); 
} 

有効期限を過ぎた。

+1

私はちょうど私のことを考え出した。私の問題はSignOutAsyncを間違ってオーバーライドしたことです。私はそれを削除し、元のものを使用した後。それは今正しく動作します。 – maxisam

+0

@maxisamあなたはもっと詳しく説明できますか?私もここで同じ問題を抱えています。 –

+0

@HaikalNashuhaごめんなさい、今のことを覚えていない。アイデンティティサーバーの独自のメソッドを作成しようとしていたと思いますが、SignOutAsyncを間違ってオーバーライドしました。 – maxisam

関連する問題