MVC6和Web Api身份验证

时间:2016-02-03 17:50:08

标签: asp.net asp.net-mvc asp.net-core-mvc

嗯,这是一个错误。 我决定将我的MVC5应用程序迁移到MVC6,一切正常,直到我需要迁移我的身份验证。 我的MVC应用程序使用外部Web Api 2应用程序登录,该应用程序返回令牌。 我构建了一个过滤器来处理这个非常简单:

/// <summary>
/// Uses the session to authorize a user
/// </summary>
public class SimpleAuthorize : AuthorizeAttribute
{

    /// <summary>
    /// Authorizes the user
    /// </summary>
    /// <param name="httpContext">The HTTP Context</param>
    /// <returns></returns>
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var accessToken = httpContext.Session["AccessToken"];

        if (accessToken == null)
            return false;

        return true;
    }
}

适用于所有控制器。 现在,您似乎是can't do that anymore as mentioned here。 那么,我如何让我的应用程序使用API​​?

我试过搜索,发现没有什么可以帮助我解决我的情况。有谁知道我怎么能解决这个问题,或者能指出一些体面的文件?

1 个答案:

答案 0 :(得分:0)

您可以通过编写授权中间件来接近它,该中间件会从访问令牌中创建一个身份。拥有有效身份足以使授权成功,然后您可以深入研究政策,如果您需要更详细的内容。像

这样的东西
public class SessionAuthenticationHandler : 
    AuthenticationHandler<SessionAuthenticationOptions>
{

    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        var sessionToken = Request.HttpContext.Session.GetString("Token");

        if (sessionToken == null)
        {
            return AuthenticateResult.Failed("No session token");
        }

        // Construct principal here
        var principal = 
            new ClaimsPrincipal(new ClaimsIdentity(new[] { 
                new Claim("SessionToken", sessionToken) }, Options.AuthenticationScheme));

        var ticket = new AuthenticationTicket(principal, new AuthenticationProperties(), 
            Options.AuthenticationScheme);
        return AuthenticateResult.Success(ticket);
    }
}

说过ASP.NET从未使用会话来保存身份验证详细信息的原因是会话固定攻击。