C# [Authorize]成功后OpenIDConnect SSO出现问题

C# [Authorize]成功后OpenIDConnect SSO出现问题,c#,asp.net-mvc,azure-active-directory,openid-connect,kentico-mvc,C#,Asp.net Mvc,Azure Active Directory,Openid Connect,Kentico Mvc,我还在学习MVC认证,所以我道歉。 我正在尝试使用OpenIDConnect和Azure AD来设置SSO,并且基于Microsoft在Azure网站的快速入门中提供的示例。特别是打电话 app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { //options } 然后使用[Authorize]属性将用户重定向到Microsoft登录。这是可行的,我正

我还在学习MVC认证,所以我道歉。 我正在尝试使用OpenIDConnect和Azure AD来设置SSO,并且基于Microsoft在Azure网站的快速入门中提供的示例。特别是打电话

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions
    { 
        //options 
    }
然后使用[Authorize]属性将用户重定向到Microsoft登录。这是可行的,我正在收回用户的索赔

但是,当我将RedirectUrl添加到OpenIdConnectAuthenticationOptions中时,它似乎被忽略,请求在验证后返回到启动操作,而不是执行回调

当我通过SignIn发出直接质询时,重定向工作正常,但这需要我以某种方式将对页面的任何“未经授权”访问重定向到该SignIn方法。如果[授权]能做同样的工作,我认为这更干净。 在线阅读表明[Authorize]故意在事后返回基本操作,因此我认为我没有做错什么

在任何情况下,如果[Authorize]这样做都没关系,除了在授权成功时,我想在执行带有[Authorize]标记的实际操作之前运行一些自定义代码(设置一些自定义cookie值/会话变量,检查数据库以匹配用户与我们的系统,诸如此类)。 我不想在他们“登录”的时候做每一个请求。 理想情况下,我将能够访问新验证的声明,或者更好地访问事件中的ExternalLoginInfo对象

是否有我可以为此目的附加一些代码的事件或东西

我发现“SecurityTokenValidated”,但该方法中的用户和登录信息都为null

我还试着在[Authorize]完成后等待,直到我回到基地行动。我有用户,但没有外部登录信息,我不想将“post auth”代码复制/粘贴到用户可以到达站点的每个操作上

这是我的startup.Auth.cs:

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

app.UseCookieAuthentication(new CookieAuthenticationOptions());

// I tried creating a second temporary cookie with WebCookieManager, that didn't help.
//app.UseCookieAuthentication(new CookieAuthenticationOptions
//{
//    AuthenticationType = DefaultAuthenticationTypes.ExternalCookie,
//    CookieName = OWIN_COOKIE_PREFIX + DefaultAuthenticationTypes.ApplicationCookie,
//    ExpireTimeSpan = TimeSpan.FromMinutes(5),
//    CookieManager = new SystemWebCookieManager()
//});

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions
    {
        ClientId = clientId,
        Authority = authority,
        RedirectUri = postLoginRedirectUri, //This seems to get ignored anyways in favor of returning to the [Authorize]-marked Action.
        Scope = OpenIdConnectScopes.OpenIdProfile,
        ResponseType = OpenIdConnectResponseTypes.IdToken,
        TokenValidationParameters = new TokenValidationParameters() { ValidateIssuer = true },
        Notifications = new OpenIdConnectAuthenticationNotifications 
        { 
            SecurityTokenValidated = OnAuthenticationSuccess
        }
    });

您应该检查db things并在SecurityTokenValidated方法中设置HttpContext.Current.Session等。也许你可以检查一下这个问题,并从中获得如何做你想做的事情的灵感?此外,也许应该首先检查context.AuthenticationTicket.Identity.IsAuthenticated,以确保身份验证成功?