asp.net-web-api – Web API 2 OWIN承载令牌认证 – AccessToken
| 
                         我有一个现有的ASP.NET MVC 5项目,我正在添加一个Web API 2项目。我想使用承载令牌认证,并遵循了Hongye Sun的教程“OWIN承载令牌认证与Web API示例”和 
 this question。 
  
  
在我的登录方法中,对于行Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket); AccessTokenFormat为null。任何想法为什么? 我的帐户控制器: [RoutePrefix("api")]
public class AccountController : ApiController
{        
    public AccountController() {}
    // POST api/login
    [HttpPost]
    [Route("login")]
    public HttpResponseMessage Login(int id,string pwd)
    {
        if (id > 0) // testing - not authenticating right now
        {
            var identity = new ClaimsIdentity(Startup.OAuthBearerOptions.AuthenticationType);
            identity.AddClaim(new Claim(ClaimTypes.Name,id.ToString()));
            AuthenticationTicket ticket = new AuthenticationTicket(identity,new AuthenticationProperties());
            var currentUtc = new SystemClock().UtcNow;
            ticket.Properties.IssuedUtc = currentUtc;
            ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(30));
            var token = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket);
            return new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new ObjectContent<object>(new
                {
                    UserName = id.ToString(),AccessToken = token
                },Configuration.Formatters.JsonFormatter)
            };
        }
        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    }
    // POST api/token
    [Route("token")]
    [HttpPost]
    public HttpResponseMessage Token(int id,string pwd)
    {
        // Never reaches here. Do I need this method?
        return new HttpResponseMessage(HttpStatusCode.OK);
    }
} 
 启动类: public class Startup
{
    private static readonly ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; private set; }
    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }
    public static Func<MyUserManager> UserManagerFactory { get; set; }
    public static string PublicClientId { get; private set; }
    static Startup()
    {
        PublicClientId = "MyWeb";
        UserManagerFactory = () => new MyUserManager(new UserStore<MyIdentityUser>());
        OAuthBearerOptions = new OAuthBearerAuthenticationOptions();
        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/api/token"),Provider = new MyWebOAuthProvider(PublicClientId,UserManagerFactory),AuthorizeEndpointPath = new PathString("/api/login"),AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),AllowInsecureHttp = true
        };
    }
    public void Configuration(IAppBuilder app)
    {         
        // Enable the application to use bearer tokens to authenticate users
        app.USEOAuthBearerTokens(OAuthOptions);
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,LoginPath = new PathString("/api/login")
        });
        // Configure Web API to use only bearer token authentication.
        var config = GlobalConfiguration.Configuration;            
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthBearerOptions.AuthenticationType));
        app.UseWebApi(config);                          
    }
} 
 MyIdentityUser只添加一个额外的属性: public class MyIdentityUser : IdentityUser
{
    public int SecurityLevel { get; set; }
} 
 MyUserManager将自定义用户身份验证方法调用到内部服务器: public class MyUserManager : UserManager<MyIdentityUser>
{
    public MyUserManager(IUserStore<MyIdentityUser> store) : base(store) { }
    public MyIdentityUser ValidateUser(int id,string pwd)
    {
        LoginIdentityUser user = null;
        if (MyApplication.ValidateUser(id,pwd))
        {
            // user = ??? - not yet implemented
        }
        return user;
    }
} 
 MyWebOAuthProvider(我从SPA模板中获取,只有GrantResourceOwnerCredentials已经被更改): public class MyWebOAuthProvider : OAuthAuthorizationServerProvider
{
    private readonly string _publicClientId;
    private readonly Func<MyUserManager> _userManagerFactory;
    public MyWebOAuthProvider(string publicClientId,Func<MyUserManager> userManagerFactory)
    {
        if (publicClientId == null)
        {
            throw new ArgumentNullException("publicClientId");
        }
        if (userManagerFactory == null)
        {
            throw new ArgumentNullException("userManagerFactory");
        }
        _publicClientId = publicClientId;
        _userManagerFactory = userManagerFactory;
    }
    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        using (MyUserManager userManager = _userManagerFactory())
        {
            MyIdentityUser user = null;
            var ctx = context as MyWebOAuthGrantResourceOwnerCredentialsContext;
            if (ctx != null)
            {
                user = userManager.ValidateUser(ctx.Id,ctx.Pwd);
            }                
            if (user == null)
            {
                context.SetError("invalid_grant","The user name or password is incorrect.");
                return;
            }
            ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user,context.Options.AuthenticationType);
            ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user,CookieAuthenticationDefaults.AuthenticationType);
            AuthenticationProperties properties = CreateProperties(user.UserName);
            AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity,properties);
            context.Validated(ticket);
            context.Request.Context.Authentication.SignIn(cookiesIdentity);
        }
    }
    public override Task TokenEndpoint(OAuthTokenEndpointContext context)
    {
        ...  // unchanged from SPA template
    }
    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        ...  // unchanged from SPA template
    }
    public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
    {
        ...  // unchanged from SPA template
    }
    public static AuthenticationProperties CreateProperties(string userName)
    {
        ...  // unchanged from SPA template
    }
} 
 MyWebOAuthGrantResourceOwnerCredientialsContext: public class MyWebOAuthGrantResourceOwnerCredentialsContext : OAuthGrantResourceOwnerCredentialsContext
{
    public MyWebOAuthGrantResourceOwnerCredentialsContext (IOwinContext context,OAuthAuthorizationServerOptions options,string clientId,string userName,string password,IList<string> scope)
        : base(context,options,clientId,userName,password,scope)
    { }
    public int Id { get; set; }        
    public string Pwd { get; set; }
} 
 如何设置AccessTokenFormat?是我设定的正确吗?我不会对任何外部服务进行身份验证,只是传统的内部服务器。 解决方法
 我有同样的问题 – 这与我在Startup()中的初始化有关。 
  
  
        像你一样,我将OAuthBearerOptions存储在静态字段中: OAuthBearerOptions = new OAuthBearerAuthenticationOptions(); 但是后来我错误地使用了同一个类的新实例: app.USEOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); // wrong! 显然,修复是使用静态字段: app.USEOAuthBearerAuthentication(OAuthBearerOptions); 实际上,它看起来不像你调用USEOAuthBearerAuthentication()。我跟着这个excellent series of posts由Taiseer Joudeh。 全面启动 public class Startup
{
    public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; private set; }
    public void Configuration(IAppBuilder app)
    {
        HttpConfiguration config = new HttpConfiguration();
        ConfigureOAuth(app);
        WebApiConfig.Register(config);
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        app.UseWebApi(config);
    }
    public void ConfigureOAuth(IAppBuilder app)
    {
        //use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseExternalSignInCookie(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);
        OAuthBearerOptions = new OAuthBearerAuthenticationOptions();
        OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() {
            AllowInsecureHttp = true,TokenEndpointPath = new PathString("/token"),AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),Provider = new SimpleAuthorizationServerProvider()  // see post
        };
        // Token Generation
        app.USEOAuthAuthorizationServer(OAuthServerOptions);
        app.USEOAuthBearerAuthentication(OAuthBearerOptions);
        //[Configure External Logins...]
    }
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
- asp.net-mvc-3 – 如何模拟查询字符串
 - asp.net-mvc-3 – 是否可以在ASP.NET MVC中重用多个项目的部
 - asp.net-mvc – 用于MVC导出到Excel的Kendo UI Grid不做任何
 - asp.net – 如何获得Google Prettify更像Visual Studio
 - asp.net-mvc – Server 2008 R2上的MVC – 如何?
 - asp.net-mvc – 在FSharp.Core旁边找不到FSharp.Core.sigda
 - Asp.net网站和网站服务托管
 - asp.net-mvc-4 – 如何为使用StatusCode 404抛出HttpExcept
 - 使用ASP.NET重定向到非www-url域?
 - asp.net-mvc-4 – 带有返回URL的注销链接(OAuth)
 
- asp.net-mvc – ASP.NET MVC:返回FileResult时如
 - asp.net – .Net平台有Django还是Rails?
 - 带有子项的ASP.NET自定义/用户控件
 - asp.net – 在安全连接(HTTPS)中使用与SignalR的
 - MVC 3验证 – 仅在失去焦点或提交后显示错误消息
 - 如何在asp.net中的gridview中添加带有按钮的列?
 - 如何配置在生产服务器上运行的ASP.NET应用程序?
 - .NET 3.5 / VS 2008上的ASP.NET Web Services的自
 - asp.net – 如何在runat =“server”表单元素中包
 - asp.net – 哪个会员提供程序实现存储在web.conf
 
