【问题标题】:Web app and web api authentication in same application同一应用程序中的 Web 应用程序和 Web api 身份验证
【发布时间】:2017-02-05 23:41:21
【问题描述】:

我有一个网络应用 MVC,使用 auth0 owin 常规网络应用基于 cookie 的身份验证。

此 Web 应用程序还具有在应用程序内部使用的 webapis。但是我需要从应用程序外部调用这个 webapis。所以我创建了一个restclient并尝试在应用程序中实现jwtbearerauthentication(但基于身份验证的cookie仍然存在)。

现在,当我从其他应用程序调用 webapi 时,它会验证承载令牌没有错误,但是由于基于 cookie 的身份验证,它会重定向到登录页面。

启动文件:

 public partial class Startup
{
    private IPlatform platform;
    public void ConfigureAuth(IAppBuilder app, IPlatform p, IContainer container)
    {
        platform = p;


        // Enable the application to use a cookie to store information for the signed in user
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            ExpireTimeSpan = System.TimeSpan.FromDays(2),
            SlidingExpiration = true
        });

        // Use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
        var provider = new Auth0.Owin.Auth0AuthenticationProvider
        {
            OnReturnEndpoint = (context) =>
            {
                // xsrf validation
                if (context.Request.Query["state"] != null && context.Request.Query["state"].Contains("xsrf="))
                {
                    var state = HttpUtility.ParseQueryString(context.Request.Query["state"]);
                    AntiForgery.Validate(context.Request.Cookies["__RequestVerificationToken"], state["xsrf"]);
                }

                return System.Threading.Tasks.Task.FromResult(0);
            },
            OnAuthenticated = (context) =>
            {
                var identity = context.Identity;
                //Add claims
                var authenticationManager = container.Resolve<IAuthenticationManager>();
                authenticationManager.AddClaims(identity);

                if (context.Request.Query["state"] != null)
                {
                    authenticationManager.AddReturnUrlInClaims(identity, context.Request.Query["state"]);
                }

                return System.Threading.Tasks.Task.FromResult(0);
            }
        };

        var issuer = "https://" + ConfigurationManager.AppSettings["auth0:Domain"] + "/";
        var audience = ConfigurationManager.AppSettings["auth0:ClientId"];
        var secret = TextEncodings.Base64.Encode(TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["auth0:ClientSecret"]));
        app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
                AllowedAudiences = new[] { audience },
                IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
                {
                    new SymmetricKeyIssuerSecurityTokenProvider(issuer, secret)
                }
            });

        app.UseAuth0Authentication(
            clientId: platform.ServerRole.GetConfigurationSettingValue("auth0:ClientId"),
            clientSecret: platform.ServerRole.GetConfigurationSettingValue("auth0:ClientSecret"),
            domain: platform.ServerRole.GetConfigurationSettingValue("auth0:Domain"),
            provider: provider);
    }
}

webapiconfig 文件:

     public static void Register(HttpConfiguration config)
    {

        // Web API routes
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new {id = RouteParameter.Optional});
        config.Filters.Add(new AuthorizeAttribute());
        ODataConfig.Setup(config);

        var clientID = WebConfigurationManager.AppSettings["auth0:ClientId"];
        var clientSecret = WebConfigurationManager.AppSettings["auth0:ClientSecret"];

        config.MessageHandlers.Add(new JsonWebTokenValidationHandler()
        {
            Audience = clientID,
            SymmetricKey = clientSecret
        });
    }

目前从下面的代码创建 jwt 令牌并在标题中使用邮递员发布只是为了检查它是否有效..但重定向到登录页面。

  string token = JWT.Encode(payload, secretKey, JwsAlgorithm.HS256);

【问题讨论】:

  • 向我们展示代码。您如何为 WebAPI 配置身份验证,以及如何从调用应用程序获取令牌。
  • 更新了问题..希望对您有所帮助
  • 这个问题解决了吗?
  • 问题解决了吗?在 Auth0 论坛上打开了一个相同的线程。如果我收到任何更新,我会在这里写一个答案
  • 你解决了吗?我有类似的情况,不敢相信没有更多关于这种方法的文档/博客/SO 条目?

标签: asp.net-web-api owin auth0


【解决方案1】:

我怀疑发生的事情是您对 API 的调用有一个未通过验证的不记名令牌(或者根本没有授权令牌),您的 API 控制器有一个 Authorize 属性,因为在调用抛出 401。 Auth0AuthenticationProvider 选择并假定调用是对 UI 的,因此重定向用户身份验证。您可能希望在 Oauth0Provider 中添加一个覆盖以捕获 OnRedirectToIdP(或类似的东西),检查请求,如果它是到 API,abot 进一步处理并返回 Unauthorized。 从您的 API 中删除任何 [Authorize],然后查看它是否有效。还要确保您的启动不需要对所有控制器进行授权。 您可能希望删除代码的 authn 部分(cookie 和 Oauth2Provider),然后查看您是否正在访问 API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-25
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2012-09-09
    • 2019-01-14
    相关资源
    最近更新 更多