使用Open Identity Connect / OAuth2登录Xamarin表单中

谁将认为使用Open Identity Connect(OIDC)和OIDC)和OAuth退出您的Xamarin表单应用bet188地址将值得拥有自己的博客文章?但它就会发生这种情况,它花了我比我最初想到的那么长。所以,如果您对OAuth和Xamarin感兴趣,您也可能对我的博客帖子感兴趣 入门, 设置IdentityServer 对于您的移动应用bet188地址和 刷新你的令牌.

但回到注销 - 首先,让我们看看记录用户与不是的内容的原因。这并不那么多。它归结为访问令牌。因此,在理论上,如果我们从应用bet188地址和httpclient标题中删除访问令牌,我们就无法再收到API的任何请求,而无需接收 401。因此,我们可以实现“注销”操作如下:

private async void Logout()
{
    _credentials = null;
    // ...
}

因此,我们无法再致电任何API的有效令牌。因此,用户被迫再次登录。但是在打开浏览器时登录时,会发生一些奇怪的事情:

注销无法注销

刚才发生了什么?!我们预计将出现登录对话,但似乎用户似乎重新陷入了焦虑。虽然一个很酷的派对技巧,如果您有共享设备,并且用户应该使用不同的帐户登录和出版,这不是我们所知的。那么我们是如何在这里结束的?

鼓励移动应用bet188地址使用OAuth2代码流。代码流将打开浏览器,用户输入其凭据,然后服务器将通过定义的回调URL回电。这是浏览器负责我们刚才见证的效果。浏览器中有一个会话cookie,“记住”用户,并且只要会话cookie仍然有效,就不会提示凭据。很酷,但这对我们来说意味着什么?

简而言之,除了删除令牌并清理请求标题之外,我们还必须通过浏览器注销。我们可以这样做,因为我们使用的登录使用 OIDC客户端 library.

public async Task<LogoutResult> Logout(string? identityToken)
{
        OidcClient oidcClient = CreateOidcClient();
        LogoutResult logoutResult = await oidcClient.LogoutAsync();
        return logoutResult;
}

当我们在注销时调用此代码时,请求用户在浏览器中确认注销,并且他还必须手动关闭浏览器窗口。

注销在理论上工作,但不是一个很好的UX体验

它有效(TM),但它感觉有点王子。对于一个,用户已经确认了应用bet188地址中的注销。浏览器窗口不会自动消失。也许有些用户甚至不会发现如何在第一阶段关闭浏览器窗口。所以让我们改善这个流程。

配置IdentityServer

The Identity Server also has to be configured accordingly to enable this, so let’s start there. But, first, we will want to allow automatic redirects by allowing them in the AccountOptions class:

public class AccountOptions
{
    // More account options
    public static bool AutomaticRedirectAfterSignOut = true;
}

Then in the configuration (Config class), we need to define a post logout URL:

// mobile client
new Client
{
    // Other configuration itmes
    PostLogoutRedirectUris = new List<string>
    {
        "oidcxamarin101:/signout-callback-oidc",
    },
    // More configuration items
}

Note that you can define it as you like. You must make sure that this deep link will work on your mobile platform. If possible, I would recommend using the same prefix as the with the login redirect. And on iOS, you will want to update the info.plist file. But before we go to the mobile client, there is still one adjustment in the Logout method in the AccountController:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout(LogoutViewModel model)
{
    // ...

    return vm.AutomaticRedirectAfterSignOut &&
           !string.IsNullOrWhiteSpace(vm.PostLogoutRedirectUri)
        ? (IActionResult) Redirect(vm.PostLogoutRedirectUri)
        : View("LoggedOut", vm);
}

随着这些采用来到IdentityServer,我们现在可以专注于客户。

配置客户端

The OIDC Client provides the LogoutAsync, which will open the browser to log out. To improve the user experience, we will want to define the PostLogoutRedirectUri in the client configuration:

var options = new OidcClientOptions
{
  // More options ...
  PostLogoutRedirectUri = "oidcxamarin101:/signout-callback-oidc",
  Browser = new WebAuthenticatorBrowser()
};

请注意,这是我们在服务器上已指定的相同的URL。此外,请注意,这将是您的应用bet188地址的深度链接。由于URL基础保持不变,因此我们只需要在Info.plist文件中注册对iOS的回调:

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
  <dict>
  <!-- Other Plist entries -->
    <key>CFBundleURLTypes</key>
    <array>
      <dict>
        <key>CFBundleURLName</key>
        <string>authentication</string>
        <key>CFBundleURLSchemes</key>
        <array>
          <!-- login redirect -->
          <string>oidcxamarin101:/authenticated</string>
          <!-- logout redirect -->
          <string>oidcxamarin101:/signout-callback-oidc</string>
        </array>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
      </dict>
    </array>
  </dict>
</plist>

剩下的最后一件事是在我们调用注销请求时沿ID令牌传递:

public async Task<LogoutResult> Logout(string? identityToken)
{
        OidcClient oidcClient = CreateOidcClient();
        LogoutResult logoutResult = await oidcClient.LogoutAsync(new LogoutRequest{IdTokenHint = identityToken});
        return logoutResult;
}

当用户现在退出然后尝试再次登录时。一切都适用于您的预期。

工作退出

后果

虽然代码提供了额外的安全性并减少攻击向量的数量,但它还提供了一些激动人心的考虑因素。对于一个,您的应用bet188地址将记住系统上使用的身份验证和浏览器所发生的身份验证。这也是为什么我们希望在注销时打开浏览器的原因,因为它是系统浏览器,也必须删除会话或从博客帖子的开头看到那种很好的效果。

不要忘记删除您存储的令牌,因为它们可能仍然有效并导致意外的副作用。

您可以找到具有所有代码的示例应用bet188地址 GitHub..

Hth.

Updated: