代码之家  ›  专栏  ›  技术社区  ›  johnny 5

.Net核心从Oauth注销

  •  0
  • johnny 5  · 技术社区  · 7 年前

    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = COINBASE_AUTH_ID;
    })
    .AddCookie()
    .AddOAuth(COINBASE_AUTH_ID, options =>
    {
        options.ClientId = Configuration["Coinbase:ClientId"];
        options.ClientSecret = Configuration["Coinbase:ClientSecret"];
        options.CallbackPath = new PathString("/signin-coinbase");
    
        options.AuthorizationEndpoint = "https://www.coinbase.com/oauth/authorize?meta[send_limit_amount]=1";
        options.TokenEndpoint = "https://api.coinbase.com/oauth/token";
        options.UserInformationEndpoint = "https://api.coinbase.com/v2/user";
    
        COINBASE_SCOPES.ForEach(scope => options.Scope.Add(scope));
    
        options.SaveTokens = true;
    
        options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "id");
        options.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
        options.ClaimActions.MapJsonKey("urn:coinbase:avatar", "avatar_url");
    
        options.Events = new OAuthEvents
        {
            OnCreatingTicket = async context =>
            {
                var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);
                request.Headers.Add("CB-VERSION", DateTime.Now.ToShortDateString());
                var response = await context.Backchannel.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.HttpContext.RequestAborted);
                response.EnsureSuccessStatusCode();
    
                var user = JObject.Parse(await response.Content.ReadAsStringAsync());
    
                context.RunClaimActions(user);
            }
        };
    });
    

    当用户登录时,我返回一个质询结果,并让默认身份验证完成它的工作。

    [HttpGet]
    public IActionResult Login(string returnUrl = "/")
    {
        return Challenge(new AuthenticationProperties() { RedirectUri = returnUrl });
    }
    

    我正在试图找出如何注销,但当我在基础控制器上调用Signout时,什么都没有发生。

    [HttpGet]
    public IActionResult Logout()
    {
        this.SignOut();
        return Redirect(Url.Content("~/"));
    }
    

    1 回复  |  直到 7 年前
        1
  •  1
  •   johnny 5    7 年前

    也许有一个更优雅的方法,但现在。我发现我可以打电话给 SignOut

    public async Task<IActionResult> Logout()
    {
        await HttpContext.SignOutAsync();
        return Redirect(Url.Content("~/"));
    }