ASP.NET:为自定义OAuthAuthorizationServerProvider编写AuthenticationProvider

时间:2015-10-30 11:18:23

标签: c# asp.net asp.net-mvc asp.net-mvc-4 authentication

我已经创建了一个自定义身份验证服务器,它实现了OAuthAuthorizationServerProvider以及使用此服务器进行身份验证所需的所有其他类。该服务器由ASP.NET Web API项目组成。这是一个独立的项目,我想使用OAuth 2.0来使用它来验证某些应用程序。想想多个ASP.NET MVC 5网站。 AuthenticationServer和网站彼此分开托管。

这就是我想创建一个自定义AuthenticationProvider的原因,我可以在我的ASP.NET MVC 5网站中使用它来验证用户身份。 这Overview是我想要实现的全球情况。

我希望每个客户/网站都有一个登录屏幕,他们可以填写用户凭据,然后我希望网站与配置的ClientId& ClientSecret和给定的用户凭据。然后,如果用户通过身份验证,则用户应该能够在cookie或会话中保存其访问令牌和所有其他用户信息(如姓名等)。

我尝试为它开发一个AuthenticationProvider,因此很容易将身份验证移植到多个ASP.NET网站,但我还没有成功。我也不知道我的方法是否使用AuthenticationProvider是正确的做法,因此非常欢迎有关此方法和替代方法的建议。

我已经尝试过开发这样的AuthenticationProvider并尝试在Startup-class中配置它:

public partial class Startup
{
    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
    public void ConfigureAuth(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType("ExternalCookie");
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = "ExternalCookie",
            AuthenticationMode = AuthenticationMode.Passive,
            CookieName = ".AspNet.ExternalCookie",
            ExpireTimeSpan = TimeSpan.FromMinutes(5),
        });
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        var options = new CustomAuthenticationOptions
        {
            ClientId = "42ff5dad3c274c97a3a7c3d44b67bb42",
            ClientSecret = "jh52g35vnm23bjh54g235jhg234",
            Provider = new CustomAuthenticationProvider
            {
                OnAuthenticated = context =>
                {
                    context.Identity.AddClaim(new Claim("urn:token:customprovider", context.AccessToken));

                    return Task.FromResult(true);
                }
            }
        };
        app.UseCustomAuthentication(options);
    }
}

但是,提供程序能够与AuthenticationServer通信,但无法对客户端进行身份验证。我不知道这是怎么造成的。似乎AuthenticationProvider没有发送ClientId&在请求中秘密(正确)。

我创建了一个小原型来测试我的AuthenticationServer,它使用来自Thinktecture.IdentityModel.Client的OAuth2Client来验证用户:

string tokenEndpoint = "http://localhost:61182/oauth/token"; // Token end point
OAuth2Client client = new OAuth2Client(new Uri(tokenEndpoint), "42ff5dad3c274c97a3a7c3d44b67bb42", "jh52g35vnm23bjh54g235jhg234"); // Client ID and Secret
TokenResponse tokenResponse = client.RequestResourceOwnerPasswordAsync("testAcc", "test").Result;

AuthenticationServer能够处理此问题并在身份验证成功时返回Accesstoken。然后,Accesstoken用于对AuthenticationServer内的控制器进行经过身份验证的请求。 这很成功,但我想为ASP.NET MVC网站实现这一点。

我的问题是:使用我的AuthenticationServer for ASP.NET MVC网站实现自定义身份验证的最佳方法是什么?

0 个答案:

没有答案