簡體   English   中英

如何將承載令牌轉換為MVC應用程序的身份驗證Cookie

[英]How to convert bearer token into authentication cookie for MVC app

我有一個三層的應用程序結構。 有一個針對最終用戶的cordova js應用程序,一個充當OpenID授權的Identityserver3實現以及一個MVC應用程序,可以通過cordova應用程序中的應用程序內瀏覽器進行訪問。

用戶的起始入口是cordova應用程序。 他們通過應用程序內瀏覽器登錄那里,然后可以訪問應用程序功能或單擊鏈接以打開應用程序內瀏覽器並訪問MVC應用程序。

我們保護MVC網站安全的策略是使用承載令牌身份驗證,因為我們已經從該應用程序登錄一次,並且不希望在將用戶定向到MVC應用程序時提示用戶再次登錄:

app.Map("/account", account =>
{
    account.UseIdentityServerBearerTokenAuthentication(new IdentityServer3.AccessTokenValidation.IdentityServerBearerTokenAuthenticationOptions()
    {
        Authority = "https://localhost:44333/core",
        RequiredScopes = new string[] { "scope" },
        DelayLoadMetadata = true,
        TokenProvider = new QueryStringOAuthBearerProvider(),
        ValidationMode = ValidationMode.ValidationEndpoint, 
    });
}

由於將access_token保留在查詢字符串上很麻煩,因此我實現了自定義OAuthBearerAuthenticationProvider:

public class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider
{
    private static ILog logger = LogManager.GetLogger(typeof(QueryStringOAuthBearerProvider));
    public override Task RequestToken(OAuthRequestTokenContext context)
    {
        logger.Debug($"Searching for query-string bearer token for authorization on request {context.Request.Path}");

        string value = GetAccessTokenFromQueryString(context.Request);

        if (!string.IsNullOrEmpty(value))
        {
            context.Token = value;
            //Save the token as a cookie so the URLs doesn't need to continue passing the access_token
            SaveAccessTokenToCookie(context.Request, context.Response, value);
        }
        else
        {
            //Check for the cookie
            value = GetAccessTokenFromCookie(context.Request);
            if (!string.IsNullOrEmpty(value))
            {
                context.Token = value;
            }
        }

        return Task.FromResult<object>(null);
    }
    [cookie access methods not very interesting]
}

這樣可以正常工作,並且允許MVC應用程序不必將訪問令牌持久存儲在每個請求中,但是將訪問令牌存儲為通用Cookie似乎是錯誤的。

我真正想做的是使用訪問令牌與OpenID端點一起使用,並發出一個表單身份驗證樣式cookie,該cookie響應注銷。 我發現可以添加account.UseOpenIdConnectAuthentication(..)但是如果我通過access_token進行身份驗證,則將跳過OpenIdConnectAuthentication位。 有任何想法嗎?

您不需要-訪問令牌旨在用於調用Web API。 您可以使用OIDC的id_token對用戶進行身份驗證,並根據內部聲明發出本地身份驗證cookie。 Microsoft OpenIdConnect身份驗證中間件將為您完成大部分繁重的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM