使用WIF在Asp.Net 4.5上进行自定义身份验证

时间:2012-12-02 22:03:53

标签: c# .net .net-4.5 wif

我使用Azure ACS和.net 4.5使用声明设置了应用程序。我的应用程序也使用dropbox。我想知道我是否可以让用户通过Dropbox单独识别它们。

当用户使用dropbox和唯一ID登录时,我从dropbox获取了一个令牌。在.net管道中,我告诉它我已经对用户进行了身份验证,这样的主体也会在下一个请求中设置。

为了使示例简单,假设我有一个带有两个输入的表单。命名,通过。如果名称是1234并且传递是1234.那么我想告诉asp.net管道用户是否经过身份验证。这可能吗?或者我是否需要创建自定义令牌处理程序以将其集成到WIF中?

更新

我发现了这一点:我想对解决方案发表评论,如果有安全问题我应该注意。

        var sam = FederatedAuthentication.SessionAuthenticationModule;
        if (sam != null)
        {
            var cp = new ClaimsPrincipal(new ClaimsIdentity(new List<Claim> {new Claim("Provider","Dropbox")}, "OAuth"));
            var transformer = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.ClaimsAuthenticationManager;
            if (transformer != null)
            {
                cp = transformer.Authenticate(String.Empty, cp);
            }
            var token = new SessionSecurityToken(cp);
            sam.WriteSessionTokenToCookie(token);
        }

所有代码:

public HttpResponseMessage get_reply_from_dropbox(string reply_from)
{
    var response = this.Request.CreateResponse(HttpStatusCode.Redirect);
    var q = this.Request.GetQueryNameValuePairs();
    var uid = q.FirstOrDefault(k => k.Key == "uid");
    if (!string.IsNullOrEmpty(uid.Value))
    {
        var sam = FederatedAuthentication.SessionAuthenticationModule;
        if (sam != null)
        {
            var cp = new ClaimsPrincipal(new ClaimsIdentity(new List<Claim> {new Claim("Provider","Dropbox")}, "OAuth"));
            var transformer = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.ClaimsAuthenticationManager;
            if (transformer != null)
            {
                cp = transformer.Authenticate(String.Empty, cp);
            }
            var token = new SessionSecurityToken(cp);
            sam.WriteSessionTokenToCookie(token);
        }
    }

    response.Headers.Location = new Uri(reply_from);
    return response;
}
public async Task<string> get_request_token_url(string reply_to)
{

    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization =
        new AuthenticationHeaderValue("OAuth", 
            string.Format("oauth_version=\"1.0\", oauth_signature_method=\"PLAINTEXT\", oauth_consumer_key=\"{0}\", oauth_signature=\"{1}&\"",
            "<dropboxkey>","<dropboxsecret>"));
    var data = await client.GetStringAsync("https://api.dropbox.com/1/oauth/request_token");

    var pars = data.Split('&').ToDictionary(k=>k.Substring(0,k.IndexOf('=')),v=>v.Substring(v.IndexOf('=')+1));

    return "https://www.dropbox.com/1/oauth/authorize?oauth_token=" + pars["oauth_token"]
        + "&oauth_callback=<MYSITE>/api/dropbox/get_reply_from_dropbox?reply_from=" + reply_to;


}

它通过用户请求验证URL工作,当用户验证我的应用程序时,它返回到get_reply_from_dropbox并登录用户。

我还需要处理其他一些东西,比如请求不是来自Dropbox。

1 个答案:

答案 0 :(得分:1)

我使用WIF 3.5(不完全相同)为我的网站做了这个,但它确实使用了ACS +表单auth + OAuth,基本上它使用表单auth(你可以完全控制)或使用ACS / OAuth和链接帐户在一起或仅使用ACS / OAuth。

您必须以不同的方式处理注销。

http://garvincasimir.wordpress.com/2012/04/05/tutorial-mvc-application-using-azure-acs-and-forms-authentication-part-1/

DropBox使用OAuth,所以我会去那条路线然后如果你想“链接帐户”,为表格auth链接到DropBox Oauth帐户创建一个用户/密码。用户不一定知道正在使用的auth约定。 ASP.NET MVC 4在默认项目中构建了OAuth / forms auth。