【问题标题】:MVC application Cookie AND Token authentication in Web Api projectWeb Api 项目中的 MVC 应用程序 Cookie AND Token 身份验证
【发布时间】:2018-10-09 14:25:39
【问题描述】:

我目前正在从事一个有 2 个客户的项目。一个MVC 客户端和一个Android 客户端。

我已经为我的MVC 控制器的authentication 实现了ASP .Net IdentityMVC 项目还包括一些网络 API 控制器。在我看来,我调用了这两个控制器,以及对我的 web 的一些 ajax 调用API

问题:当我从浏览器向 Web API(或控制器)进行 ajax 调用时,是否可以使用 cookie based authentication,但是当我从 android 应用程序进行 ajax 调用时,是否可以使用 token authentication

我正在使用 .Net Framework 4.6.1

【问题讨论】:

    标签: c# .net asp.net-mvc oauth-2.0 jwt


    【解决方案1】:

    定义两个策略:一个用于 API (apipolicy),另一个用于在 Startup.cs 中的正常 MVC 调用 (defaultpolicy) ConfigureServices 方法:

    services.AddAuthorization(options =>
    {
        // define several authorization policies if needed
        options.AddPolicy("defaultpolicy", b =>
        {
            b.RequireAuthenticatedUser();
        });
        options.AddPolicy("apipolicy", b =>
        {
            b.RequireAuthenticatedUser();
            // define which authentication is used for this policy
            b.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
        });
    });
    

    要应用每个策略,您需要使用所需的 [Authorize ("policy")] 属性来装饰控制器,例如:

    SampleDataApiController.cs - 应用了 apipolicy

    [Authorize ("apipolicy")]
    [Route("api/[controller]")]
    public class SampleDataApiController : Controller
    {
    }
    

    AccountController.cs - 应用默认策略

    [Authorize("defaultpolicy")]
    [Route("[controller]/[action]")]
    public class AccountController : Controller
    {
    }
    

    这里的示例是我完整的 ConfigureServices 方法,可以给你一个想法:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    
        services.AddAuthorization(options =>
        {
            options.AddPolicy("defaultpolicy", b =>
            {
                b.RequireAuthenticatedUser();
            });
            options.AddPolicy("apipolicy", b =>
            {
                b.RequireAuthenticatedUser();
                b.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
            });
        });
    
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = "CustomScheme";
        })
        .AddCookie()
        .AddJwtBearer(options =>
        {
            // Bearer Logic
        })
        .AddOAuth("CustomScheme", options =>
        {
            // Oauth Logic
        });
    }
    

    为简单起见,我只是添加了以下 nuget。 Microsoft.AspNetCore.All

    【讨论】:

    • 似乎无法识别 services.AddAuthorization 和 services.AddAuthentication。难道我做错了什么?我将 ConfigureServices 方法放在了我的 startup.cs 中?
    • 我正在使用 dotnet 核心项目。我添加了 Microsoft.AspNetCore.All nuget 包。
    • 啊哈!我使用的是 .NET Framework 4.6.1,而不是核心版本,我应该提到这一点。我还能以某种方式使用你的例子吗?我发现了很多 .NET 核心示例,但不是针对普通框架的。
    • 不幸的是,它们是特定于 dotnet 核心的。对不起。
    猜你喜欢
    • 2017-10-29
    • 2016-07-16
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 2016-04-13
    • 2020-01-23
    • 1970-01-01
    相关资源
    最近更新 更多