加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 使用Cookie认证的asp net core项目MVC控制器和使用Be

发布时间:2020-12-16 03:55:27 所属栏目:asp.Net 来源:网络整理
导读:我正在使用ASP .net CORE开发一个项目,我们有Angular 2和MVC以及API,需要受Azure AD保护. Home / Index MVC控制器将启动Angular 2 SPA,Home / Index需要通过cookie身份验证进行保护.我设法使用OpenIdConnectAuthentication – OnAuthorizationCodeReceived事
我正在使用ASP .net CORE开发一个项目,我们有Angular 2和MVC以及API,需要受Azure AD保护.

Home / Index MVC控制器将启动Angular 2 SPA,Home / Index需要通过cookie身份验证进行保护.我设法使用OpenIdConnectAuthentication – OnAuthorizationCodeReceived事件获取令牌.

我需要使用基于Cookie的身份验证和使用承载身份验证的API来保护MVC控制器(除了Home / Index之外还有更少的控制器),我可以从API获取令牌到Angular,然后在每次后续API调用时使用该令牌.

在不久的将来,将会有使用Bearer令牌调用相同API端点的移动应用程序.

这是我的出发点:
https://docs.microsoft.com/en-us/azure/active-directory/active-directory-appmodel-v2-overview

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
   services.AddMvc().AddJsonOptions(config => { config.SerializerSettings.ContractResolver = new DefaultContractResolver(); });

   services.AddAuthentication(sharedOptions => sharedOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme);
}

public void Configure(IApplicationBuilder app,IHostingEnvironment env,ILoggerFactory loggerFactory)
{
   app.UseCookieAuthentication(new CookieAuthenticationOptions());

   Authority = $"https://login.microsoftonline.com/AAAAA}";
   ClientId = "BBBB";
   ClientSecret = "CCCC";
   Audience = "https://localhost:44333/";

   app.USEOpenIdConnectAuthentication(new OpenIdConnectOptions
   {
      ClientId = ClientId,Authority = Authority,PostLogoutRedirectUri = Audience,ResponseType = OpenIdConnectResponseType.CodeIdToken,GetClaimsFromUserInfoEndpoint = false,Events = new OpenIdConnectEvents
      {
        OnTokenValidated = TokenValidated,OnRemoteFailure = OnAuthenticationFailed,OnAuthorizationCodeReceived = OnAuthorizationCodeReceived
      }
   });

     app.UseMvc(....);
}

题:

如何配置API以仅使用“Bearer”auth和MVC来使用Cookie?

更新

嗨Adem
谢谢您的回复.

我从不厌倦第一选择,现在就试试吧.
但是我之前已经厌倦了第二个选项,并且只是如下所述累了.

在下面添加了app.USEOpenIdConnectAuthentication(…

app.UseJwtBearerAuthentication(new JwtBearerOptions
{
   Authority = "https://login.microsoftonline.com/AAAA",Audience = "https://BBB.onmicrosoft.com/CCCC"
});

对于API控制器[授权(ActiveAuthenticationSchemes =“Bearer”)]

对于MVC控制器[授权(ActiveAuthenticationSchemes =“Cookies”)]

当它击中我的Home Controller时会出现此错误
不支持指定的方法.

这个堆栈跟踪
在Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler1.HandleSignInAsync(SignInContext context)
?在Microsoft.AspNetCore.Authentication.AuthenticationHandler1.d__66.MoveNext()
?—从抛出异常的先前位置开始的堆栈跟踪结束—
?在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
?在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
?在Microsoft.AspNetCore.Http.Authentication.Internal.DefaultAuthenticationManager.d__14.MoveNext()
?—从抛出异常的先前位置开始的堆栈跟踪结束—
?在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
?在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
?在Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler1.< HandleRemoteCallbackAsync> d__6.MoveNext()
?—从抛出异常的先前位置开始的堆栈跟踪结束—
?在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
?在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
?在Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler1.d__5.MoveNext()
?—从抛出异常的先前位置开始的堆栈跟踪结束—
?在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
?在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
?在Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.d__15.MoveNext()
?—从抛出异常的先前位置开始的堆栈跟踪结束—
?在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
?在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
?在Microsoft.AspNetCore.Authentication.AuthenticationMiddleware1.< Invoke> d__18.MoveNext()
?—从抛出异常的先前位置开始的堆栈跟踪结束—
?在Microsoft.AspNetCore.Authentication.AuthenticationMiddleware1.d__18.MoveNext()
?—从抛出异常的先前位置开始的堆栈跟踪结束—
?在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
?在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
?在Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.d__6.MoveNext()

更新2:
我已经厌倦了为API和MVC配置2个不同的auth,如下所示

app.UseWhen(context => 
  context.Request.Path.StartsWithSegments("/api"),appBuilder =>
  {
    app.UseJwtBearerAuthentication(new JwtBearerOptions
    {
      Authority = Authority,Audience = Configuration["Authentication:AzureAd:Audience"]
    });
  });
app.UseWhen(context => 
  !context.Request.Path.StartsWithSegments("/api"),appBuilder =>
  {
    app.USEOpenIdConnectAuthentication(new OpenIdConnectOptions
    {
      ClientId = ClientId,OnAuthorizationCodeReceived = OnAuthorizationCodeReceived
      }
  });
});

但API似乎仍在使用cookie身份验证.我仍然可以看到请求中包含cookie.

谢谢
Asanka

解决方法

一种方法是像这样分支应用程序:

app.UseWhen(context => <isApiRequest>,appBuilder =>
{
    appBuilder.UseJwtBearerAuthentication(); 
} 
app.UseWhen(context => <isNotApiRequest>,appBuilder =>
{
    appBuilder.UseCookieAuthentication();
}

注意:您可以使用“/ api”前缀分支您的api,在这种情况下< isApiRequest>将是context.Request.Path.StartsWithSegment(“/ api”)

另一种方法是使用AuthenticationScheme:

app.UseCookieAuthentication(//....);
app.UseJwtBearerAuthentication(//...);

然后在api动作中使用Bearer方案:

[Autho?rize(ActiveAuthenticationSchemes = "Bearer")]
public IActionResult ApiAction(){}

对于mvc操作,请使用Cookies方案

[Autho?rize(ActiveAuthenticationSchemes = "Cookies")]
public IActionResult MvcAction(){}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读