在Asp.Net 4.5自定义身份验证与WIF(Custom Authentication on A

2019-08-03 10:59发布

我有一个设置了Azure的ACS和.NET 4.5使用的权利要求的应用程序。 我的应用程序使用的保管箱也。 我在想,如果我可以让用户单独识别他们的自我与Dropbox的。

我从Dropbox的令牌当用户与Dropbox和一个唯一的ID登录英寸 凡在.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,并在用户登录。

我offcause需要处理一些其他的东西也一样,如果请求不是来自Dropbox的东西。

Answer 1:

我这样做是为了使用WIF 3.5(不完全一样),我的网站,但它没有使用ACS +窗体身份验证+ 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,所以我会走这条路,然后,如果你想“关联帐户”创建链接到保管箱的Oauth帐户窗体身份验证用户/密码。 用户不必知道正在使用哪些AUTH约定。 ASP.NET MVC 4内置了默认的项目中的OAuth /窗体身份验证。



文章来源: Custom Authentication on Asp.Net 4.5 with WIF